2016-07-27 2 views
0

많은 자습서에서 ReWriteLock의 재진입 불가능한 구현에서 나타났습니다.ReadWriteLocks- 읽기 잠금을 얻기 위해 여러 독자를 지원하는 방법 (재진입이 아닌)

public class ReadWriteLock{ 

    private int readers  = 0; 
    private int writers  = 0; 
    private int writeRequests = 0; 

    public synchronized void lockRead() throws InterruptedException{ 
     while(writers > 0 || writeRequests > 0){ 
     wait(); 
     } 
    readers++; 
    } 

    public synchronized void unlockRead(){ 
     readers--; 
     notifyAll(); 
    } 

    public synchronized void lockWrite() throws InterruptedException{ 
     writeRequests++; 

     while(readers > 0 || writers > 0){ 
     wait(); 
     } 
     writeRequests--; 
     writers++; 
    } 

    public synchronized void unlockWrite() throws InterruptedException{ 
     writers--; 
     notifyAll(); 
    } 
} 

질문 :

객체 (lock 말)이 클래스는 동기화를 위해 모든 독자와 작가 스레드에서 공유된다.

리더 T1이 lock.lockRead()을 호출하면 잠금 객체에 대한 잠금이 획득되고 동시에 리더 T2가 lockRead()을 동일한 객체에 호출한다고 가정합니다. 그러나 T1은 이미 객체를 잠갔습니다. 따라서 T2는 대기열에서 차단되고 대기해야합니다.

그래서 코드를 통해 여러 독자가 동시에 readLock을 설정할 수 있습니까?

내가 잘못했을 때 알려주십시오.

답변

2

lockRead() 메서드의 본체을 2 개의 스레드가 동시에 실행할 수 없다는 것은 사실입니다. 그러나 리더기/작가 패턴이 올바르게 작동하고 예상 된 성능을 발휘할 필요는 없습니다.

활성 글쓴이가 없으면 lockRead() 메서드가 빠르게 반환됩니다 (wait이 호출되지 않음). 메소드가 끝나면 잠금이 해제되므로 다른 스레드가 읽기 잠금을 획득 할 수 있습니다.

예, 읽기 잠금 (증분 : readers) 획득 동작이 직렬화됩니다. 그러나 너무 빨리 일어나서 잘 작동합니다.

는 설명하기 :

private ReadWriteLock lock = new ReadWriteLock(); // this instance is shared by all threads 

public void ReadSomething() { 
    try { 
     lock.lockRead(); // serialized, but very quick 

     PerformWork(); // potentially slower, but is concurrent 
    } finally { 
     lock.unlockRead(); // serialized, but very quick 
    } 
} 

이 만약 스레드가 정확히 같은 시간에 위의 ReadSomething() 방법을 실행하려고, 그것은 단지 하나의 스레드가 한 번에 lock.lockRead()을 수행 할 수 있다는 사실이다. 그러나 그 메소드가 쓰레드 중 하나를 반환하자마자 두 번째 쓰레드가이를 실행할 수있게 될 것이다. 그리고 lock.lockRead()에 대한 호출이 너무 빨리 일어나서 한 스레드가 다른 스레드를 기다리고 있다는 것을 알지 못합니다.

중요한 것은 두 스레드가 동시에 시간이 많이 걸리는 PerformWork()을 실행할 수 있다는 것입니다.

+0

감사합니다. 도움이되었습니다. – Pintu