java中AQS-ConditionObject的用法
这篇文章主要讲解了“java中AQS-ConditionObject的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中AQS-ConditionObject的用法”吧!
目前创新互联已为1000+的企业提供了网站建设、域名、虚拟空间、网站托管维护、企业网站设计、江苏网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
ConditionObject
属性 | 说明 |
---|---|
Node firstWaiter | 头节点 |
Node lastWaiter | 尾节点 |
为Condition接口实现,Condition的目的主要是替代Object的wait,notify,notifyAll方法的,它是基于Lock实现的.(而Lock是来替代synchronized方法).
结构
使用时序图
关键方法
阻塞线程:await
对应Object.wait(),通过AQS机制释放锁定的资源,终止当前线程,恢复后使用AQS独占模式重新锁定资源
acquireQueued:此时node节点已转换为AQS中节点
public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); Node node = addConditionWaiter(); long savedState = fullyRelease(node); int interruptMode = 0; while (!isOnSyncQueue(node)) { LockSupport.park(this); if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) break; } if (acquireQueued(node, savedState) && interruptMode != THROW_IE) interruptMode = REINTERRUPT; if (node.nextWaiter != null) // clean up if cancelled unlinkCancelledWaiters(); if (interruptMode != 0) reportInterruptAfterWait(interruptMode); }
唤醒线程:signal
transferForSignal转换节点后await()中acquireQueued(node,savedState)操作的节点已是AQS中的节点
isHeldExclusively:子类实现.判断是否独家持有
public final void signal() { if (!isHeldExclusively()) throw new IllegalMonitorStateException(); Node first = firstWaiter; if (first != null) doSignal(first); }
感谢各位的阅读,以上就是“java中AQS-ConditionObject的用法”的内容了,经过本文的学习后,相信大家对java中AQS-ConditionObject的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
文章题目:java中AQS-ConditionObject的用法
文章起源:http://ybzwz.com/article/poeoss.html