Java并发编程实战-----“J.U.C”:CLH队列锁

Posted liguangsunls

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发编程实战-----“J.U.C”:CLH队列锁相关的知识,希望对你有一定的参考价值。

在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格依照FIFO的队列。他可以确保无饥饿,严格的先来先服务的公平性。下图是CLH队列节点的示意图:

技术分享

在CLH队列的节点QNode中包括有一个locked的字段,该字段表示该节点是否须要获取锁。为true表示须要获取,为false表示不须要获取。在CLH队列中,节点与节点之间并非通过next指针来连接的而是通过myPred所指向节点的变化情况来影响的myNode的行为。

如果有两个线程(线程A、线程B)。開始线程A须要获得锁,那么他会创建一个QNode节点,并将locked设置为true(表示须要获取锁),同一时候获取一个指向前驱的myPred并在前驱节点的的locked上面旋转直到前驱节点是否锁为止(locked为false,这个动作我们一般称之为自旋),当然这里会将tail指向自身来表示它是CLH队列的最后一个节点。例如以下:

技术分享

然后线程B加入到CLH队列中,这时tail域应该指向线程B。

技术分享

CLH队列锁的长处在于空间复杂度低(如果有n个线程。L个锁,每一个线程每次仅仅获取一个锁,那么须要的存储空间是O(L+n),n个线程有n个myNode。L个锁有L个tail)。CLH的变种体被运用到了AQS中。

參考文献

JAVA并发编程学习笔记之CLH队列锁:http://blog.csdn.net/aesop_wubo/article/details/7533186

以上是关于Java并发编程实战-----“J.U.C”:CLH队列锁的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程实战—– AQS:CLH同步队列

Java并发编程- J.U.C组件拓展

Java并发编程- J.U.C之AQS及其相关组件详解

并发编程之J.U.C的第二篇

并发编程-并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍

并发编程-线程安全策略之并发容器(J.U.C)中的集合类