java 读写锁

http://tutorials.jenkov.com/java-concurrency/read-write-locks.html 翻译

 

     读写锁比LOCK的实现更复杂,想象有一个应用程序能读和写一些资源,但是写没有读多,两个线程读取一些资源并不会出现问题,所以多个线程能读取资源重叠的。如果一个线程想写资源,别的线程就不能操作资源。为了解决允许多个线程读一个线程写,你需要一个读写锁。

     jdk5在java.util.concurrent包实现了读写锁,虽然如此,依然是与意义的去了解背后的实现。

读写锁的java实现

读权限 如果没有线程写,并且没有线程请求写进入

写权限  没有读和写

如果一个线程想读取资源,只要没有线程写,并且没有线程请求写权限是可以,由于写线程有更高的优先级。除此之外,如果读线程发送频率比较高,并且我们不给写线程更高的优先级,饿死现象就会发生。线程请求的写权限将一直被阻塞直到所有读线程释放ReadWriteLock.如果新的线程一直准许获取读权限,导致写线程饿死。因此一个线程能够有读权限如果没有线程被ReadWriteLock锁锁住为写,或者请求已经被锁住为了写。

一个写线程是允许的如果既没有读和写线程锁住该资源。是没有关系的不管有多少线程已经申请写资源或者什么顺序,除非你想保证正正公平的。

有了这些简单的规则在你心里,我们就能实现一个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();

  }

}

 

 

 

 

 

 

 

 

你可能感兴趣的:(java)