多くのチュートリアルで、ReadWriteLock の再入不可の実装の下に出くわしました。
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()
、これがロック オブジェクトのロックを取得し、同時にリーダー T2lockRead()
が同じオブジェクトを呼び出すとします。ただし、T1 は既にオブジェクトをロックしているため、T2 はブロックされ、Queue で待機する必要があります。
では、このコードでは、複数のリーダーが同時に readLock を設定できるようにするにはどうすればよいでしょうか?
私がいつこれを間違えたのか教えてください。