[java] .class 용 Java 동기화 블록

이 자바 코드는 무엇을 의미합니까? 의 모든 개체에 대한 잠금을 얻을 수 MyClass있습니까?

synchronized(MyClass.class) {
   //is all objects of MyClass are thread-safe now ??
}

그리고 위의 코드가이 코드와 어떻게 다른지 :

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}



답변

스 니펫 synchronized(X.class)은 클래스 인스턴스를 모니터로 사용합니다. 하나의 클래스 인스턴스 (런타임에 클래스 메타 데이터를 나타내는 객체) 만 있기 때문에이 블록에는 하나의 스레드가있을 수 있습니다.

synchronized(this)블록 인스턴스에 의해 보호된다. 모든 인스턴스에 대해 하나의 스레드 만 블록에 들어갈 수 있습니다.

synchronized(X.class)블록에 정확히 하나의 스레드가 있는지 확인하는 데 사용됩니다. synchronized(this)인스턴스 당 정확히 하나의 스레드가 있는지 확인합니다. 이것이 블록의 실제 코드를 스레드로부터 안전하게 만드는 경우 구현에 따라 다릅니다. 인스턴스의 상태 만 변경하면 synchronized(this)충분합니다.


답변

다른 답변에 추가하려면 :

static void myMethod() {
  synchronized(MyClass.class) {
    //code
  }
}

다음과 같다

static synchronized void myMethod() {
  //code
}

void myMethod() {
  synchronized(this) {
    //code
  }
}

다음과 같다

synchronized void myMethod() {
  //code
}


답변

아니요, 첫 번째는 MyClass모든 인스턴스가 아닌 의 클래스 정의에 대한 잠금을 얻 습니다. 그러나 인스턴스에서 사용되는 경우 단일 클래스 정의를 공유하므로 다른 모든 인스턴스를 효과적으로 차단합니다.

두 번째는 현재 인스턴스에서만 잠금을 얻습니다.

이것이 당신의 객체를 스레드로부터 안전하게 만드는지에 관해서는 훨씬 더 복잡한 질문입니다. 우리는 당신의 코드를 봐야합니다!


답변