문제

이 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, 그것의 모든 인스턴스는 아닙니다. 그러나 인스턴스에 사용되는 경우 단일 클래스 정의를 공유하므로 다른 모든 인스턴스를 효과적으로 차단합니다.

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

이것이 당신의 객체 스레드를 안전하게 만드는지 여부에 관해서는 훨씬 더 복잡한 질문입니다. 코드를 볼 필요가 있습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top