2013-05-02 6 views
0

Java에서 읽기/쓰기 모니터 구현이 있다고 가정합니다. notifyAll()가 동기화 방법의 마지막 문이 아닌 경우notifyall() 마지막 문이 아님

여러 독자 또는 지금 한 번 (둘)

class RWmonitor{ 
    private int readers = 0; 
    private boolean writing = false; 

    public synchronized void StartRead(){ ..} 
    public synchronized void EndRead(){ 
     notifyAll(); 
     readers--; 
    } 

    public synchronized void StartWrite(){ ..} 
    public synchronized void EndWrite(){ 
     notifyAll(); 
     writing = false; 
    } 
} 

에서 데이터베이스에 액세스 할 수있는 한 작가는 문제가 무엇입니까?

는 가정 : EndRead()

2 실행

1)) notifyAll() 모든 대기중인 스레드

3) 다음은 독자 카운트 감소에 통지한다.

notifyAll()을 실행하면 깨우기 스레드가 RWmonitor의 잠금을 해제하기를 기다리고 있기 때문에 비용이 더 많이 듭니까? (RWmonitor에 대한 잠금이있는 스레드가 여전히 readers--;에 있다고 가정)

답변

4

마지막 문장인지 여부는 중요하지 않습니다.

은 인용하려면 javadoc for notifyAll() : 현재의 thread가이 오브젝트의 락을 해제 할 때까지는

재개 된 스레드를 계속할 수 없습니다.

+0

효능에는 차이가 있습니까? 또는 과실로 간주 될 수 있습니까? – ali

+1

@ali - 이론적으로 알림을받은 후 최대한 빨리 동기화 된 블록을 종료하는 것이 더 효율적입니다 (즉 알림은 마지막 작업이어야 함). – jtahlborn

+0

@jtahlborn 아 괜찮아! – ali

3

아니요, 중요하지 않습니다. 잠금은 synchronized 블록의 끝까지 계속 유지되며 중간에 잠금 장치에 wait의 스레드를 사용할 수 없습니다. 사실 예외가 업데이트를 중지하지만 알림은 중지하지 않는다는 점에서 먼저 알림을받는 것이 약간 유리합니다.

+0

아 .. 예외가 업데이트를 중단시킬 수 있다고 생각하는 것이 재미 있습니다. 감사! – ali

+0

하지만 업데이트가 발생하지 않으면 처음에는 알림이 필요하지 않을 가능성이 높습니다. – jtahlborn

+0

@jtahlborn 알림 이후에 업데이트가 있기 전에 예외가 발생하면 스레드는 깨어나지 만 while 루프는 안전합니다. (비록 당신이 석방을 잃을지도 모른다.) –