다른 인스턴스를 동시에 사용하는 두 스레드가 정적 동기화 메서드를 호출하면 어떻게됩니까? 가능한가? 객체 잠금은 비 정적 동기화 메소드에 사용되지만 정적 동기화 메소드에는 어떤 유형 잠금이 사용됩니까?java static synchronized method
3
A
답변
6
이 방법을 구현하는 Class
개체 동기화와 같은, 그래서 긍정하는 것이 가능하고, 예 메커니즘 효과적으로 메소드가 호출되는 이리저리 인스턴스 무시 :
class Foo {
private static synchronized doSomething() {
// Synchronized code
}
}
가입니다 이것을 쓰는 지름길 :
class Foo {
private static doSomething() {
synchronized(Foo.class) {
// Synchronized code
}
}
}
6
가능합니다.
스레드는 MyClass.class
과 같이 클래스의 Class
개체를 잠급니다.
는 JLS, Section 8.4.3.6. synchronized Methods를 참조하십시오
8.4.3.6. synchronized 메소드
동기화 된 메소드는 모니터를 실행하기 전에 (17.1) 모니터를 확보합니다.
클래스 (정적) 메서드의 경우 메서드 클래스의 클래스 개체와 연결된 모니터가 사용됩니다.
0
static synchronized 메소드는 java.lang.Class 유형의 인스턴스에서 잠금을 사용합니다. 즉, 각 액세스 가능 클래스는 런타임에 Class 유형의 객체로 표시되며 해당 객체는 정적 동기화 된 메소드에 의해 사용됩니다.
0
정적 잠금을 사용하면 개체가 무시됩니다. 잠금은 객체가 아닌 클래스에서 획득됩니다.
정적 메서드는 제공된 경우 인스턴스 변수를 무시합니다. 오류없이 'null'일 수도 있습니다. 정적 메소드의 경우 클래스 객체가 사용됩니다. –
http://stackoverflow.com/questions/437620/java-synchronized-methods-lock-on-object-or-class에서 토론 됨 – yair