자바 병렬 프로 그래 밍 동기 화

동기 화 원 어 - 동기 화
synchronized (class) 는 매우 특별 합 니 다. 다른 스 레 드 는 class 를 Monitor 로 가 져 올 곳 에서 기다 릴 수 있 습 니 다. class 와 this 를 다른 모니터 로 사용 할 수 있 습 니 다. 하나의 스 레 드 가 class 를 가 져 오지 않 으 면 다른 스 레 드 는 이 class 의 인 스 턴 스 를 가 져 올 수 없습니다.
[list]
  • - > 스 레 드 는 각각 Monitor 를 얻 고 기다 리 지 않 습 니 다.
  • synchronized(class)
    synchronized(this)
  • - > 서로 다른 스 레 드 가 같은 인 스 턴 스 대상 을 감시 하면 기다 리 고 서로 다른 인 스 턴 스 가 있 으 면 기다 리 지 않 습 니 다.
  • synchronized(this)
    synchronized(this)
  • - > 서로 다른 스 레 드 가 같은 인 스 턴 스 나 다른 인 스 턴 스 대상 을 감시 하면 기다 릴 것 입 니 다.
  • synchronized(class)
    synchronized(class)

    [/list]
    ===============================================================================
    이어서 synchronized 가 코드 에 미 치 는 영향 에 대해 토론 합 니 다.
    P1, P2 가 같은 유형의 서로 다른 대상 이 라 고 가정 하면 이 유형 에서 다음 과 같은 몇 가지 상황 의 동기 화 블록 이나 동기 화 방법 을 정의 하면 P1, P2 는 모두 이 를 호출 할 수 있다.
    1. synchronized 를 함수 수정자 로 사용 할 때 예제 코드 는 다음 과 같다.
    Public synchronized void methodAAA()
    
    {
    
    //….
    
    }

    이것 이 바로 동기 화 방법 입 니 다. 이때 synchronized 가 잠 긴 대상 은 무엇 입 니까?그것 이 잠 긴 것 은 이 동기 화 방법 대상 을 호출 하 는 것 이다.즉, 대상 P1 이 서로 다른 스 레 드 에서 이 동기 화 방법 을 실행 할 때 이들 은 서로 배척 하고 동기 화 효 과 를 거 둘 수 있다 는 것 이다.하지만 이 대상 이 속 한 Class 에 의 한 다른 대상 P2 는 이 를 임의로 호출 할 수 있 습 니 다.
    synchronized 키워드 방법.
    위의 예제 코드 는 다음 과 같은 코드 와 같 습 니 다.
    public void methodAAA()
    
    {
    
    synchronized (this)      // (1)
    
    {
    
           //…..
    
    }
    
    }

    (1) 처 의 this 가 가리 키 는 것 은 무엇 입 니까?그것 은 P1 과 같은 이 방법 을 사용 하 는 대상 을 말한다.이 를 통 해 알 수 있 듯 이 동기 화 방법 은 실질 적 으로 synchronized 를 object reference 에 작용 하 는 것 이다.그것 은 P1 대상 자물쇠 의 스 레 드 를 받 아야 P1 의 동기 화 방법 을 호출 할 수 있 습 니 다. P2 에 있어 P1 이라는 자 물 쇠 는 그것 과 무관 합 니 다. 프로그램 도 이런 상황 에서 동기 화 체제 의 통 제 를 벗 어 나 데이터 혼란 을 초래 할 수 있 습 니 다. (
    2. 동기 블록, 예제 코드 는 다음 과 같다.
    public void method3(SomeObject so)
    
    {
    
        synchronized(so)
    
        { 
           //….. 
        }
    
    }

    이 때 자 물 쇠 는 so 라 는 대상 입 니 다. 이 자 물 쇠 를 가 져 온 사람 이 제어 하 는 코드 를 실행 할 수 있 습 니 다. 명확 한 대상 이 자물쇠 로 있 을 때 프로그램 을 이렇게 쓸 수 있 습 니 다. 그러나 명확 한 대상 이 자물쇠 로 되 어 있 지 않 고 코드 를 동기 화하 고 싶 을 때 특수 한 intance 변 수 를 만 들 수 있 습 니 다.
    class Foo implements Runnable
    
    {
    
            private byte[] lock = new byte[0]; // 特殊的instance变量
    
            Public void methodA() 
            {
    
               synchronized(lock) { //… }
    
            }
    
            //…..
    
    }

    주: 0 길이 의 byte 배열 대상 을 만 들 면 그 어떠한 대상 보다 경제적 입 니 다. 컴 파일 된 바이트 코드 를 봅 니 다. 0 길이 의 byte [] 대상 을 만 들 려 면 3 개의 조작 코드 만 필요 하고 Object lock = new Object () 는 7 줄 의 조작 코드 가 필요 합 니 다.
    3. synchronized 를 static 함수 에 사용 합 니 다. 예제 코드 는 다음 과 같 습 니 다.
    Class Foo 
    {
    
        public synchronized static void methodAAA()   // 同步的static 函数 
        { 
            //…. 
        }
    
        public void methodBBB() 
        {
    
           synchronized(Foo.class)   // class literal(类名称字面常量)
    
        } 
    }

      
    코드 에 있 는 methodBBB () 방법 은 classliteral 을 잠 금 으로 하 는 경우 입 니 다. 동기 화 된 static 함수 와 같은 효과 가 있 습 니 다. 잠 금 은 매우 특별 합 니 다. 현재 이 방법 을 호출 하 는 대상 이 속 한 클래스 (Class, 더 이상 이 Class 에서 발생 하 는 구체 적 인 대상 이 아 닙 니 다) 입 니 다.
    'Effective Java' 라 는 책 에서 Foo. class 와 P1. getClass () 를 동기 화 잠 금 으로 사용 하 는 것 을 본 적 이 있 습 니 다. P1. getClass () 로 이 Class 를 잠 그 는 목적 을 달성 할 수 없습니다. P1 은 Foo 류 에서 발생 하 는 대상 을 말 합 니 다.
    [/list]

    좋은 웹페이지 즐겨찾기