2013-12-17 3 views
0

클래스의 문이 실행되는 동안이 블록이 Foo 및 정적 멤버에 대한 모든 액세스를 차단합니까? 실행 즉 클래스 개체에서 동기화가 전체 클래스 (및 해당 멤버)를 차단합니까

MyBlock: 
synchronize(Foo.class) 
{ 
    // ... do something 
} 

, MyBlock 동안, 다른 스레드는 오른쪽 Foo에서 정적 메서드를 호출 할 수 없을 것이다?

좋습니다. 그런 다음 클래스와 멤버가 일정 시간 액세스하지 못하게하려면 어떻게해야합니까? 감사합니다

+2

없음. 그것은 동기화가 작동하는 방식이 아닙니다. 기본적으로, 자물쇠를 취하는 객체는 그 자체로 관련이 없습니다. 여러개의 쓰레드가 같은 객체를 잠그려고 할 때만 의미가있다. – njzk2

+2

또한 시도해 볼 수 있습니다. – njzk2

+0

잘못되었습니다. 동일한 클래스 객체에 대해 잠그는 모든 실행 경로를 차단합니다. "클래스를 차단하는 것"과 같은 것이 없습니다. –

답변

3

아니요.이 경우 잠금 개체 자체 인 Foo.class 개체는 잠금 개체로 사용하는 동기화 된 블록의 영향을받지 않습니다.

액세스를 제어하는 ​​프록시와 같은 클래스를 사용하지 않는 한 클래스를 사용하지 못하도록하거나 클래스 자체에서 실행을 조건부로 차단하여 액세스를 방해하지는 않지만 실제로 시뮬레이트합니다.

+0

(내 질문이 업데이트 됨)과는 아무런 관련이 없습니다. –

0

정적 멤버를 잠 그려면 잠길 수있는 더미 정적 멤버를 정의하고 정적 멤버에 액세스하려고 할 때마다 해당 더미 멤버가 잠겨 있는지 확인하면됩니다.

class Foo{ 
    public static Integer dummyLock; 
.... 
} 

afterwhich을 할 수 있습니다 MyBlock :

synchronize(Foo.dummyLock) 
{ 
    // ... access static members here 
}