读书人

Java的ReadWriteLock兑现机制解析(1)

发布时间: 2012-12-21 12:03:49 作者: rapoo

Java的ReadWriteLock实现机制解析(1)

? ? ? 如果接触过多线程编程或者大规模并发应用的开发的人都应该知道Readers-writer lock的设计模式,从英文字面上看就是对于资源允许多个Reader(复数)并发读,单个Writer写的锁机制,而Reader和Writer互斥。

?

????? 现在的JDK里有一个ReadWriteLock的接口和一个ReentrantReadWriteLock的实现类,而其作者是赫赫有名的Doug Lea大牛(他有本 Concurrent Programming in Java Design Principles and Pattern,推荐一下) 。早在JDK 1.4的时代,他就发表了自己的cocurrent包实现,其中就有多个ReadWriteLock的实现。下面会先聊一下早期Doug Lea在EDU.oswego.cs.dl.util.concurrent版本中对ReadWriteLock的实现,最后再说JDK版本的。


1.EDU.oswego.cs.dl.util.concurrent的实现

?

???? Doug Lea的这个版本:EDU.oswego.cs.dl.util.concurrent包中ReadWriteLock所包含的内容比JDK要丰富不少,除了ReentrantReadWriteLock还有若干个其他实现。先看一下ReadWriteLock在其中的类继承关系。源代码下载

?

?Java的ReadWriteLock兑现机制解析(1)

?

?

?

?

?

?

?

这其中包含了4个ReadWriteLock,包括先进先出的FIFOReadWriteLock,Writer优先的WriterPreferenceReadWriteLock,Reader优先的ReaderPreferenceReadWriteLock,可重入ReentrantWriterPreferenceReadWriteLock

?

1.1 EDU.oswego.cs.dl.util.concurrent.ReadWriteLock接口

public void release() {    Signaller s = endWrite();    if (s != null)        //如果没有write的waiter,返回的的是readerLock_,则通知所有waiting的reader结束等待        //如果有write的waiter,返回的的是writeLock,则通知一个正在等待的writer获得控制权        s.signalWaiters();}protected synchronized Signaller endWrite() {    activeWriter_ = null;    //如果没有writer,则通知所有的等待的reader    if (waitingReaders_ > 0 && allowReader())        return readerLock_;    //优先通知一个等待的writer    else if (waitingWriters_ > 0)        return writerLock_;    else        return null;}
?

??? 最后看看WriterLock和ReaderLock如何实现Writer优先

?? * 首先在竞争控制权时,Reader在竞争控制权必须确认既没有占用控制权的Writer也没有等待控制权的writer

?

??? 这里是调用的是allowRead方法

???? activeWriter_ == null && waitingWriters_ == 0;

?

?? * 其次在WriterLock的release方法里,调用endWrite,然后也会调用allowReader,确认没有等待的Writer才会返回readerLock_,并在signalWaiters里调用notifyAll通知所有的等待reader结束等待。而一旦有writer等待,则调用writerLock_,只通知等待的writer竞争控制权。具体代码见上文。

?

? ?? * 同时在ReaderLock的release方法里,调用endRead,返回writerLock_,通知等待的writer竞争控制权。具体代码见上文。

?

???? 到此为止WriterPreferenceReadWriteLock的实现基本说完,这个版本的实现下载见http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html

?

????? 同时附件里有Doug Lea - Concurrent Programming in Java Design Principles and Pattern,在这本书的3.3.3.1有关于Reader和Writer的一些设计模式讲解。

?

?

?

1 楼 littleJava 2011-03-28 楼主解析的很给力啊,很少用doug lee的包,一般用的是jdk自带的并发包 2 楼 daizz 2011-04-15 jdk自带的就是Doug Lea升级过的,更复杂一些

读书人网 >编程

热点推荐