2011-01-27 3 views
0

나는 다음의 효과가 어떻게 될지 궁금 :synchronized 절에서 동기화 개체를 다시 할당 하시겠습니까?

Object mutex; 
... // mutex initialized in constructor etc. 
public setMutex(Object mutex) { 
    synchronized(this.mutex) { 
     this.mutex = mutex; 
    } 
} 

내가 본 비슷한 질문 자바를 위해 특별히 아무것도 다른 언어로 이런 종류의 일을하지하지만에 대해 조언을 제기했다. 또한 겉으로보기에는 자기 방어적인 코드이기 때문에 왜 이런 일을하고 싶어하는지에 대해 많은 질문을 보았습니다.

내 근거는 setMutex()가 호출 될 때 내 코드의 다른 중요한 섹션이 뮤텍스를 사용하고 있으며, 중요한 섹션이 종료 될 때까지 뮤텍스를 다시 할당하지 않기를 바란다. 그래서 뮤텍스가 무언가를 보호하고 있는지를 유지하면서 뮤텍스 설정에 대한 경쟁 조건을 지키지 않는 것입니다. 나는 그것이 의미가되기를 바란다 :

개인적으로 나는 그것이 잘 작동해야한다고 생각하지만, 나는 정말로 모른다.

EDIT : 입력하는 동안 메소드 서명 ... musta brainfartet에서 "synchronized"키워드를 제거했습니다.

+0

좋은 IDE (넷빈즈)도 "비 최종 필드를 동기화"경고를보고하는 것를 참조하십시오. –

+0

경고 (intellij)가 표시되었지만 때때로 동기화 객체를 재 할당해야하는 경우가 있습니다. 하지만 예 - 보통 - 실수. – Nick

+0

객체가 아닌 메소드에'synchronized'를 사용하십시오. –

답변

1

정말 위험합니다. 먼저이 동기화 된 블록은 동작을 전혀 변경하지 않습니다.

이 동기화 된 블록을 사용하는 다른 스레드 (또는 this.mutex를 기반으로하는 또 다른 스레드)는 일 수 있으며은 아마도 다른 인스턴스에서 동기화되지만 스레드가 this.mutex 필드를 캐시했는지 여부에 달려 있지 않을 수 있습니다. 그것으로 사고 할당을 방지하기 위해 최종 현장을 표시하는 것이 좋습니다 및 있도록

volatile

+0

스레드 캐싱에 대한 귀하의 요지를 이해한다면, 뮤텍스가 휘발성으로 표시되면 캐싱이 제거됩니다. 어쩌면 내가 설명서를 잘못 읽고 있지만 동기화 된 블록 내에서 액세스 한 변수가 블록 입구에 업데이트 될 것이라고 말하는 것 같습니다. 나는 돌아가서 그것을 다시 읽을 것이다. 어쨌든, "아마도 다른 인스턴스와 동기화 될 것입니다"라는 말로 되돌아 가서, 나는 당신의 요지를 보았습니다. 나는 이것에 대해 조금 생각해보고 다른 의견으로 돌아가거나 주어진 답을 받아 들일 것입니다. 감사합니다 :) – Nick

+0

나는 이것이 심지어 가장 큰 문제라고 생각하지 않습니다. 스레드 T1이 뮤텍스 필드를 통해받은 객체에서 차단되면 다른 스레드가 어떤 뮤텍스 필드가 참조를 변경하더라도 해당 뮤텍스에서 차단 된 채로 남아 있습니다. 어느 시점에서 나는 의미있는 의미를 보지 못한다. –

+0

동의 함 - "다른 인스턴스에서 아마도 동기화 될 것입니다"에 대한 귀하의 의견을 암시한다고 생각했던 것.이런 소리는 아마 막 다른 골목 이었을지 모르지만, 내 머리는 느린 속도로 진행되어 여전히 생각하고 있습니다. – Nick

1

나는 이것이 의미있는 목적을 제공하지 않는다고 생각합니다. 모니터에 들어가기 위해 "뮤텍스 (mutex)"필드의 이전 값을 기다리고있는 모든 사람들은 여전히 ​​원래의 객체를 기다리고있을 것이며 새로운 도착자는 새로운 값을 기다리게 될 것입니다.
동기 프리미티브의 값을 변경해야하는 이유를 이해하지 못합니다.

+0

나는 코드를 수정할 수없고 동기화 객체로 자체를 사용하는 다른 스레드 된 클래스 Y와 동기화해야하는 스레드 된 클래스 X가 있습니다. 런타임 동안 X의 인스턴스는 Y의 끊임없이 변화하는 인스턴스에 대해 동기화해야합니다. X에서 Y를 동기화 할 수 없으므로 Y를 계속 변경하면 X를 동기화하는 방법을 찾아야합니다. 그보다 더 복잡한 것은 아니지만 기본 아이디어로 넘어갑니다. – Nick

+0

어쨌든 나는 제안 된 접근 방식의 무의미 함을보기 시작했습니다. – Nick

관련 문제