.class 용 Java 동기화 블록


102

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

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

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

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

답변:


144

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

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

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


6
"인스턴스가있는만큼 많은 스레드가 블록에 들어갈 수있다"는 것은 두 번째 형식이 사실이 아닌 세마포어 역할을한다는 것을 의미합니다. "synchronised (this)는 클래스의 주어진 인스턴스에 대해 하나의 스레드 만 블록에 들어갈 수 있도록합니다"와 같이 말해야합니다.
liwp 2010-01-13

수정되었습니다. 나는 그것을 말하고자했다.
Thomas Jung

2
클래스 인스턴스와 인스턴스는 무엇입니까?
Weishi 쩡

따라서 정적 메서드가 있고 모든 본문을 동기화하지 않으려면 동기화 (this)가 좋지 않고 대신 동기화 (Foo.class)가 적합합니다. 맞습니까?
krupal.agile

84

다른 답변에 추가하려면 :

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

다음과 같다

static synchronized void myMethod() {
  //code
}

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

다음과 같다

synchronized void myMethod() {
  //code
}

12
처음 두 예제에 "static"이라는 키워드가 있다는 것을 알기 위해 두 번째 읽기가 필요했습니다. 이것을보고 놓친 다른 사람들에게 그것을 지적하십시오. static 키워드가 없으면 처음 두 예제는 동일하지 않습니다.
kurtzbot 2014-07-24

1
이러한 예는 동일하지 않습니다! 동기화 된 메서드는 스레드가 메서드를 호출하려고 할 때 구멍으로 "동기화"됩니다. 반면에 블록은 위와 아래에 여러 스레드에서 실행될 수있는 코드를 가질 수 있습니다. 블록 내에서만 동기화됩니다! 그것은 동일하지 않습니다!
JacksOnF1re

public static Singleton getInstance () {if (instance == null) {동기화 됨 (Singleton.class) {instance = new Singleton (); }} 반환 인스턴스; }
JacksOnF1re

2
요점은 블록 외부에 코드 없다는 것 입니다synchronized . 그것은 그것들을 동등하게 만듭니다. 한 가지 예를 변경하면 실제로 더 이상 동일하지 않습니다.
Jorn

22

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

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

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


1
예, MyClass.class는 모든 정적 변수가 될 수 있으며 동일한 효과를 갖습니다.
pstanton 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.