자바 다 중 스 레 드 (5) synchronized 키워드 수식 코드 블록
이것
synchronized(this){
//
}
여기 서 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 는 방법 이나 코드 세그먼트 가 아 닌 대상 이나 클래스 (사실은 대상) 를 잠 그 고 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.