混淆了自定义读写锁实现

时间:2017-04-20 19:41:47

标签: java multithreading synchronization

我在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仅在waitwriteRequests大于writers时调用0write Thread如何才有机会获得read Threads锁?

  • 根据上述假设和陈述,多个lockRead()如何同时访问某个方法,因为它们应首先调用同步的File.Exists

1 个答案:

答案 0 :(得分:0)

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

简化事情:

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