정적 변수를 사용하여 동기화 한 경우의 효과는 무엇입니까? 같은 잠금이 모든 인스턴스가 공유되기 때문에동기화 된 결과 (정적 변수)
public class Something {
public static final String LOCK = "lala";
public void doSomething(){
synchronized(LOCK){
...
}
}
}
정적 변수를 사용하여 동기화 한 경우의 효과는 무엇입니까? 같은 잠금이 모든 인스턴스가 공유되기 때문에동기화 된 결과 (정적 변수)
public class Something {
public static final String LOCK = "lala";
public void doSomething(){
synchronized(LOCK){
...
}
}
}
하나 개의 스레드는 Something
인스턴스가 무엇이든 한 번에서 doSomething()
를 호출 할 수 있습니다.
완료하려면 @assylias에서 공용 변수를 동기화하지 말고 String 풀로 인해 비공개 인 경우에도 공유되는 문자열 리터럴에 대해 동기화하지 마십시오. 다른 관련없는 클래스가 동일한 잠금에서 동기화되도록하지 마십시오. 교착 상태와 같은 부작용이 발생합니다.
동기화 된 블록을 입력하기 전에 스레드가 얻은 잠금은 객체 레벨 잠금이 아닌 클래스 레벨 잠금이됩니다.
아니요, 이것은 전혀 비슷하지 않습니다. 정적 메소드는 인스턴스 필드에 액세스 할 수 없습니다. –
예, 동기화 사용 사례를 고려한 것입니다. 그 부분을 삭제했습니다. Tx –
http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html 또한 공개 변수에 대한 잠금은 좋지 않은 아이디어이며 문자열 리터럴에서는 훨씬 더 나쁜 아이디어입니다. – assylias
변수에 동기화를하지 않으면 객체에 동기화되므로 '정적'인지 여부는 중요하지 않습니다. –
이것은'doSomething()'을 동시에 호출 할 수 없다는 것을 의미합니다 .. –