我在read-write lock
中使用java
看到了一些关于自定义wait/notify
实施的帖子。它看起来像:
public class ReadWriteLock{
private int readers;
private int writers;
private int writeRequests;
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();
}
}
我无法理解它是如何正常工作的,除非我没有正确理解wait/notify
如何真正起作用。假设read
请求因此Threads
更多,我的问题是:
如果read Threads
重复获取实例上的锁定,write Thread
如何增加变量writeRequests
,因为它只能在synchronized
内增加方法。因此Thread
应首先获得锁定(如果我没有记错的话)。只要read Thread
仅在wait
或writeRequests
大于writers
时调用0
,write Thread
如何才有机会获得read Threads
锁?
根据上述假设和陈述,多个lockRead()
如何同时访问某个方法,因为它们应首先调用同步的File.Exists
?
答案 0 :(得分:0)
编辑:在看到您编辑问题之后,您会询问当多个线程在同一个同步块中调用wait()
时会发生什么 - 请参阅此内容以获取有关所谓“'”的详细说明。释放显示器' - http://www.artima.com/insidejvm/ed2/threadsynchP.html
简化事情:
synchronized(this)
块。wait()
块内调用synchronized
释放锁并将线程切换到WAITING状态。在这种情况下,其他线程可以获取对同一对象的锁定,并可能通过使用在我们的情况下等待的同一对象(this
,因为您&#)通知其他等待线程状态更改(您的解锁方法证明了这一点) 39;重新使用同步方法)unlockRead()
/ unlockWrite()
) - 这意味着它们可以在进入时阻止互斥,但不要运行任何阻止代码(并迅速结束)。
或者,他们正在等待但是非阻塞(lockRead()
/ lockWrite()
) - 就像解锁方法一样,他们的执行可能会被阻止,但是他们不会阻止,而是等待在这种情况下。