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();
}
}
05-11 22:11