
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、reentrantlock是如何基于aqs实现的reentrantlock是一个可重入的互斥锁,基于aqs实现,它具有与用法 synchronized 办法和语句相同的一些基本行为和语义,但功能更强大。lock和unlockreentrantlock 中举行同步操作都是从lock办法开头。lock猎取锁,举行一系列的业务操作,结束后用法unlock释放锁。private final reentrantlock lock = new reentrantlock();public void sync()lock.lock();try / method body finally lock.unloc
2、k()lockreentrantlock 中lock的实现是通过调用aqs的 abstractqueuedsynchronizeracquire 办法实现。public final void acquire(int arg) /尝试猎取锁if (!tryacquire(arg) &&acquirequeued(addwaiter(node.exclusive), arg)selfinterrupt();按照之前介绍的模板办法模式,对于锁的猎取tryacquire是在reentrantlock中实现的。而非公正锁中的实际实现办法为nonfairtryacquire。reentra
3、ntlocknonfairtryacquireprotected final boolean tryacquire(int acquires) return nonfairtryacquire(acquires);final boolean nonfairtryacquire(int acquires) final thread current = thread.currentthread();int c = getstate();if (c = 0) if (compareandsetstate(0, acquires) setexclusiveownerthread(current);re
4、turn true;else if (current = getexclusiveownerthread() int nextc = c + acquires;if (nextc 0) do node.prev = pred = pred.prev; while (pred.waitstatus 0);pred.next = node; else compareandsetwaitstatus(pred, ws, node.signal);return false;推断一个节点是否需要被堵塞是通过该节点的前继节点的状态推断的。假如前继节点状态为 singal ,则表示前继节点还在等待,当前节点
5、需要继续被堵塞。返回true。假如前继节点大于0,则表示前继节点为取消状态。取消状态的节点不参加锁的竞争,挺直跳过。返回false。假如前继节点时其他状态(0,propagate),不举行堵塞,表示当前节点需要重试尝试猎取锁。返回false。shouldparkafterfailedacquire办法假如返回true,表示需要将当前节点堵塞,堵塞办法为parkandcheckinterrupt。abstractqueuedsynchronizerparkandcheckinterruptprivate final boolean parkandcheckinterrupt() locksupp
6、ort.park(this);return terrupted();堵塞是通过locksupport举行堵塞,被堵塞的节点不参加锁的竞争(不在举行循环猎取锁),只能被unpark后才继续竞争锁。而被堵塞的节点要被释放则依靠于unlock办法。unlockreentrantlock 中unlock的实现是通过调用aqs的 abstractqueuedsynchronizerrelease 办法实现。public final boolean release(int arg) if (tryrelease(arg) node h = head;if (h != null &
7、& h.waitstatus != 0)unparksuccessor(h);return true;return false;release调用tryrelease办法,tryrelease是在 reentrantlock 中实现。reentrantlocktryreleaseprotected final boolean tryrelease(int releases) int c = getstate() - releases;if (thread.currentthread() != getexclusiveownerthread()throw new illegalmonit
8、orstateexception();boolean free = false;if (c = 0) free = true;setexclusiveownerthread(null);setstate(c);return free;tryrelease办法规律很容易,首先减去releases(普通为1)表示释放一个锁,假如释放后state=0表示释放锁胜利,后续等待的节点可以猎取该锁了。假如state!=0则表示该锁为重入锁,需要多次释放。当释放锁胜利后(state=0),会对头结点的后继节点举行unpark。abstractqueuedsynchronizerunparksuccessor
9、private void unparksuccessor(node node) int ws = node.waitstatus;if (ws 0) s = null;for (node t = tail; t != null && t != node; t = t.prev)if (t.waitstatus 0的节点)。公正锁和非公正锁reentrantlock 的构造办法接受一个可选的公正参数。当设置为 true 时,在多个线程的竞争时,倾向于将锁分配给等待时光最长的线程。public reentrantlock(boolean fair) sync = fair ? ne
10、w fairsync() : new nonfairsync();在多个锁竞争统一资源的环境下,aqs维护了一个等待队列,未能猎取到锁的线程都会被挂到该队列中。假如用法公正锁则会从队列的头结点开头猎取该资源。而按照代码在公正锁和非公正锁的实现的差别仅仅在于公正锁多了一个检测的办法。公正锁protected final boolean tryacquire(int acquires) /if (c = 0) if (!hasqueuedpredecessors() /!hasqueuedpredecessors()便是比非公正锁多出来的操作&& compareandsetstate(0, acquires) setexclusiveownerthread(current);return true;/return false;hasqueuedpredecessors()public final boolean hasqueuedpredecessors() node t = tail; / read fields in reverse initialization ordernode h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论