gpt4 book ai didi

java - 与自定义读写锁实现混淆

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:30 25 4
gpt4 key购买 nike

我看过一些关于使用 wait/notifyjava 中实现自定义读写锁的帖子。它看起来像:

 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更多,我的问题是:

  • 如果读线程重复获取实例上的锁,那么写线程如何增加变量writeRequests,因为它只能在synchronized方法中增加。因此,Thread 应该首先获取锁来执行此操作(如果我没有记错的话)。只要读线程仅在writeRequestswriters大于0时调用wait,那么写线程如何有机会获取锁?

  • 基于上述假设和陈述,多个读取线程如何同时访问一个方法,因为它们应该首先调用也是同步的lockRead()

最佳答案

编辑:看到您编辑问题后,您会问当多个线程在同一同步块(synchronized block)内调用 wait() 时会发生什么 - 请参阅此内容以获取有关所谓“释放监视器”的详细说明 - http://www.artima.com/insidejvm/ed2/threadsynchP.html

为了简化事情:

  • 同步方法类似于 synchronized(this) block 。
  • synchronized block 内调用wait()会释放锁并将线程切换到WAITING状态。在这种情况下,其他线程可以获取同一对象上的锁,并可能通过使用等待的同一对象(在我们的例子中是 this ,因为您使用的是同步方法)来通知其他等待线程状态更改(您的解锁方法证明了这一点)
  • 如果您根据该原则映射调用每个方法的可能场景,您会发现这些方法要么是非等待的 (unlockRead()/unlockWrite()) - 这意味着它们可以在进入时阻止互斥,但不会运行任何阻塞代码(并迅速结束)。或者,它们正在等待但非阻塞(lockRead()/lockWrite()) - 就像解锁方法一样,它们的执行可能会被停止,但它们不会阻塞,而是在这种情况下等待。
  • 因此,在任何情况下,您都可以将您的代码视为非阻塞,因此它不会造成任何真正的问题(至少我看不到)。
  • 也就是说,您应该防止解锁不存在的锁,因为这会导致计数器低于 0 的不良行为(这反过来会影响锁定方法)

关于java - 与自定义读写锁实现混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43528507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com