在java中同步读者和作者

时间:2014-10-21 10:56:39

标签: java multithreading

我想实现自己的readWriteLock课程,而不使用API​​提供的readWriteLock

我遇到这种情况:

public void read(){
    if(!write){
    read = true;
   //any thread can enter here and read;
    ....
    read = false;
    }
}

 public syncrhonized void write(){
    if(!read){
         write = true;
         //only one thread at time can write.
         ....
         write = false;
   }
}

此代码可能会出现许多不良情况,例如:

  • 如果一个帖子进入if(!read){...}内部并立即变为真,那么它就无法写入。
  • 如果线程进入if(!write){...}内部并立即变为真,那么他们就无法阅读。

我设法使用atomicBoolean,但这对于同时想要阅读的所有主题都是mutex - exclusion,而这并不能解决歧义。

有人能给我一个解释吗?

提前感谢。

1 个答案:

答案 0 :(得分:1)

你要做的不是一个好主意。正如您自己已经提到的那样,已有一种现有的机制。为什么重新发明轮子?

如果您确实需要自己的实现,要正确执行,需要更多同步块。您需要同步获取和释放读锁定,您不仅可以同步访问write方法。

我没有检查但看起来很好的例子。所有学分归Jakob Jenkov(http://tutorials.jenkov.com/java-concurrency/read-write-locks.html

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();
  }
}