2017-11-16 9 views
1

이 코드는 괜찮습니까? 아니면 별도의 잠금 객체를 만들어야합니까? 교착 상태에 빠질 가능성이 있는지 묻고 있습니다. 나는 그것이 언어가 그것을 허용하기 때문에 그것이 작동해야한다고 가정하지만, 오히려 어떻게 그것이 작동하는지 그리고 그것이 왜 ok인지 또는 왜 그것이 좋지 않은지를 이해할 것임을 확신하기 위해서.잠금으로 동기화 된 객체를 사용할 수 있습니까

var foo = false 

fun bar() 
{ 
    synchronized(foo) { 
     foo = !foo 
    } 
} 
+0

의견의 근거는 무엇입니까? 수락 된 대답은 의견이 아니며 자물쇠와 같은 물건을 갖는 것이 왜 위험 할 수 있는지 설명합니다. – rozina

답변

3

코드가 예상치 못한 방식으로 손상되었습니다.

private static boolean foo; 

public static final void bar() { 
    Boolean var0 = Boolean.valueOf(foo); 
    synchronized(var0) { 
     foo = !foo; 
    } 
} 

그래서 당신은 기본적으로 Boolean 클래스 내부의 TRUE 또는 FALSE 싱글 중 하나 내 JRE에있는의 valueOf 함수가 반환 객체 무엇에 잠금있어 : 여기에 자바 디 컴파일이 생성하는 바이트 코드의 단순화 된 버전입니다 (이 또한 단순화) :

public class Boolean { 
    public static final Boolean TRUE = new Boolean(true); 
    public static final Boolean FALSE = new Boolean(false); 

    public static Boolean valueOf(boolean var0) { 
     return var0 ? TRUE : FALSE; 
    } 
} 

특정 런타임 독립적 인 코드를위한 가장 좋은 방법은에 동기화 할 Any의 별도의 인스턴스를 만들 아마.

+0

이것은 제가 찾고있는 정보입니다. 모든 간접 지정으로 인해 숨겨진 항목이 빠르게 숨겨지고 동기화 버그는 일반적으로 디버그하기가 어렵습니다. 정보 주셔서 감사합니다! – rozina

+0

내 잠금이 기본 유형이기 때문에 이런 현상이 발생합니까? 비 프리미티브 타입 이었으면 이런 종류의 잠금은 괜찮을까요? – rozina

+1

그것은 권투에서 유래하는이 특정한 문제점을 해결할 것입니다, 그렇습니다. 그러나 동기화 된 블록 내에서 다시 할당하려는 경우 [Java의 최종 필드에서 동기화] (https://stackoverflow.com/a/6910838/4465208)와 동일한 고려 사항이 적용됩니다. . 난 여전히 별도의 동기화 개체와 함께 갈 것입니다. – zsmb13