자바 다 중 스 레 드 (5) synchronized 키워드 수식 코드 블록

전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/xingjiarong/article/details/47916703 지난 블 로그 에서 우 리 는 synchronized 키워드 수식 방법의 용법 을 소 개 했 고, 이어서 synchronized 키 워드 를 소개 했다.수식 방법 외 에 도 코드 블록 을 수식 할 수 있 으 며 모두 다음 과 같은 5 가지 용법 이 있다.
이것
synchronizedthis){
    //    
}

여기 서 this 는 이 코드 를 실행 하 는 대상 을 말 합 니 다. synchronized 에서 얻 은 자 물 쇠 는 바로 this 대상 의 자물쇠 입 니 다. 이런 표기 법 은 우리 가 지난 블 로그 에서 토론 한 것 과 같 습 니 다.
public synchronized void func(){
    //    
}

2. A. class
synchronized(A.class){
    //    
}

여기 서 A. class 는 A 와 같은 것 을 얻 었 기 때문에 synchronized 키 워드 는 유형의 자물쇠 입 니 다. 이런 방법 은 아래 의 방법 과 기능 이 같 습 니 다.
public static synchronized void fun(){
    //    
}

모든 종류의 자물쇠 가 필요 한 방법 등 은 동시에 실행 할 수 없 지만, 대상 의 자물쇠 가 필요 한 방법 이나 자물쇠 가 필요 없 는 방법 과 동시에 실행 할 수 있다.
3. object. getClass ()
synchronized(object.getClass){
    //    
}

이런 방법 은 일반적으로 두 번 째 방법 과 같 지만 계승 과 다 형 이 나 타 났 을 때 얻 은 결 과 는 다르다.그래서 일반적으로 A. class 를 사용 하 는 방식 을 추천 합 니 다.
객체
synchronized(object){
    //    
}

여기 synchronized 키 워드 는 대상 object 의 자물쇠 로 이 대상 의 자물쇠 가 필요 한 모든 방법 을 동시에 실행 할 수 없습니다.
public class Trans {
private Object lock = new Object();

    public void printNum(int num){
        synchronized (lock) {
            System.out.print(Thread.currentThread());  
            for(int i=0;i<25;i++){  
                System.out.print(i+" ");  
            }  
            System.out.println();
        }          
    }


}
class MyThread implements Runnable {  
    private Trans trans;  
    private int num;  

    public MyThread(Trans trans, int num) {  
        this.trans = trans;  
        this.num = num;  
    }  

    public void run() {  
        while (true)  
        {  
            trans.printNum(num);  
            try {  
                Thread.sleep(500);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  

    }  
}

public class Test {  


    public static void main(String[] args) {  

        Trans t = new Trans();  
        Trans t1 = new Trans();  
        Thread a = new Thread(new MyThread(t, 1));  
        Thread b = new Thread(new MyThread(t1, 2));  

        a.start();  
        b.start();  

    }  

}

위의 예 에서 이러한 방법 을 사용 하여 상호 배척 방법 으로 인쇄 방법 을 달성 하려 고 했 지만 사실은 이렇게 하 는 것 은 효과 가 없 었 다. 모든 Trans 대상 은 자신의 Object 대상 이 있 기 때문에 이 두 대상 은 모두 자신의 자물쇠 가 있 기 때문에 두 스 레 드 는 서로 다른 자물쇠 가 필요 하고 두 자물쇠 사이 에 어떠한 상호작용 도 하지 않 기 때문에 상호 배척 작용 을 하지 않 을 것 이다.
5. static object
위의 코드 를 조금 만 수정 하면 서로 배척 하 는 역할 을 할 수 있 습 니 다. Trans 클래스 에서 Object 대상 의 성명 을 다음 과 같이 바 꿀 수 있 습 니 다.
private static Object lock = new Object();

이렇게 서로 다른 종 류 는 같은 object 대상 을 사용 하고 필요 한 자물쇠 도 같은 자물쇠 로 서로 배척 하 는 효 과 를 얻 을 수 있다.
두 블 로그 의 소 개 를 통 해 우 리 는 synchronized 키워드 의 용법 을 상세 하 게 토론 했다. 매우 복잡 해 보이 지만 사실은 요점 을 잡 은 후에 도 잘 구분 할 수 있다. synchronized 가 얻 은 대상 이나 유형의 자물쇠 만 보면 된다. 다른 자물쇠 가 필요 한 방법 은 동시에 실행 할 수 없고 이 자물쇠 가 필요 없 는 방법 은 모두 동시에 실행 할 수 있다.
마지막 으로 잘못된 부분 과 작별 해 야 합 니 다. 다 시 는 이런 실 수 를 하지 않 을 것 이 라 고 믿 습 니 다. synchronized 는 방법 이나 코드 세그먼트 가 아 닌 대상 이나 클래스 (사실은 대상) 를 잠 그 고 있 습 니 다.

좋은 웹페이지 즐겨찾기