2010-11-19 4 views
5

내가 이것을 볼 싱크 블록 = (스레드), 다음 스레드 널 동기화 :괜찮습니까?

// thread is a member of this class 

synchronized(this.thread) 
{ 
    this.thread.running = false; 
    this.thread.notifyAll(); // Wake up anything that was .waiting() on 
    // the thread 
    this.thread = null; // kill this thread reference. 
    // can you do that in a synchronized block? 
} 

는 여전히에 대한 잠금을 유지하면서 thread=null을 설정 됐나요?

BB 코드에서이 너겟을 발견했습니다.

+1

기본 라이브러리에서 Thread.interrupt()를 사용하지 않는 이유가 있습니까? –

답변

7

네, 괜찮습니다. synchronized 문은 잠겨있는 참조의 복사본을 가져 와서 복사본을 사용하여 끝에 잠금 해제 할 항목을 결정합니다. Java 언어 사양의

Section 14.19

이것에 대해 실제로는 명확하지 않다, 그러나 표현은 시작시 평가 상태에 있다고 않습니다 - 나중에 다시 평가하는 언급하지 않습니다.

synchronized(this.thread) 

당신은 필드를 개체에 this.thread 포인트를 동기화하는 당신은 필드를 재 할당하는

this.thread = null; 

에 :

+0

괜찮습니다.하지만 스레드 참조를 null로 설정하는 것이 좋습니다. – Adamski

+1

@Adamski : 솔직히 말해서 내가 처음에 동기화 한 것에 대해 합리적으로 강한 견해를 갖는 경향이 있습니다. 나는 그것에 들어가는 것을 피할 것이라고 생각했습니다. –

+0

동의 - 실제로 IntelliJ는이 상황에서 나와 동기화에 대해 경고합니다 비 최종 변수. – Adamski

3

는 차이가있다. 위에서 언급 한 객체로 아무 것도하지 않으므로 잠금이 유효합니다.

0

당신은 할 수는 있지만 달성하고자하는 것은 무엇이든간에 코드가 잘못되었다는 것은 거의 확실합니다. 전체 코드를 게시하십시오. 프로그래머가 동시성을 이해하지 못한다는 것을 분명히 보장합니다.

동기화에 사용되는 변수를 다시 할당하지 마십시오.

0

스레드에 새 값을 할당하는 블록이있는 경우에만 문제가 발생합니다. 이 경우 두 블록이 같은 개체에서 잠기지 않고 동일한 필드를 업데이트하므로 어떤 블록이 값을 마지막으로 할당하는지는 임의적입니다.

1

동기화 된 표현식은 항목에서 참조 해제되므로이 잠금의 나중 사용자는 NullPointerException을 얻습니다. 동기화 된 블록보다 먼저 null 체크를 넣으면 경쟁 조건을 도입 할 수 있습니다.

+0

'평가 중'항목입니다. – EJP

+3

@EJP 이상 평가 됨 - null로 평가되는 표현식은 NullPointerException을 발생시키지 않습니다. –

관련 문제