2013-08-13 6 views
3

정적 변수를 사용하여 동기화 한 경우의 효과는 무엇입니까? 같은 잠금이 모든 인스턴스가 공유되기 때문에동기화 된 결과 (정적 변수)

public class Something { 

    public static final String LOCK = "lala"; 

    public void doSomething(){ 
     synchronized(LOCK){ 
     ... 
     } 
    } 
} 
+1

http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html 또한 공개 변수에 대한 잠금은 좋지 않은 아이디어이며 문자열 리터럴에서는 훨씬 더 나쁜 아이디어입니다. – assylias

+1

변수에 동기화를하지 않으면 객체에 동기화되므로 '정적'인지 여부는 중요하지 않습니다. –

+0

이것은'doSomething()'을 동시에 호출 할 수 없다는 것을 의미합니다 .. –

답변

4

하나 개의 스레드는 Something 인스턴스가 무엇이든 한 번에서 doSomething()를 호출 할 수 있습니다.

완료하려면 @assylias에서 공용 변수를 동기화하지 말고 String 풀로 인해 비공개 인 경우에도 공유되는 문자열 리터럴에 대해 동기화하지 마십시오. 다른 관련없는 클래스가 동일한 잠금에서 동기화되도록하지 마십시오. 교착 상태와 같은 부작용이 발생합니다.

0

동기화 된 블록을 입력하기 전에 스레드가 얻은 잠금은 객체 레벨 잠금이 아닌 클래스 레벨 잠금이됩니다.

+0

아니요, 이것은 전혀 비슷하지 않습니다. 정적 메소드는 인스턴스 필드에 액세스 할 수 없습니다. –

+0

예, 동기화 사용 사례를 고려한 것입니다. 그 부분을 삭제했습니다. Tx –

관련 문제