自旋锁--CLH锁

CLH锁的实现

CLH-Lock-1.png

CLH锁的特点

  1. 使用链表来实现无界队列
  2. 使用两个ThreadLocal变量表示指针,一个指向自己的节点,一个指向前一个节点
  3. 使用一个原子引用变量指向队尾
  4. 对同一个锁,一个线程可以多次获取而不增加空间复杂度
  5. 当线程结束后,GC会自动回收内存

CLH锁的空间复杂度

如果有L把锁,n个线程,则CLH锁的空间复杂度为O(n+L)。

解释:如果有L把锁,最多只使用其中的一把来保护共享数据的操作。对于这一点,可以参考读写锁的简单实现和使用为例进行理解:

  1. http://blog.csdn.net/iter_zc/article/details/40392787
  2. http://www.cnblogs.com/zzlp/p/5174745.html

考虑最坏情形,当n个线程同时竞争其中的一把锁L1,则根据

CLH-Lock-2.png

,则L1的空间复杂度为O(n+1)。当n个线程依次执行完共享数据操作后,除了tail指针还在引用着在锁创建时新建的qNode节点外,其余的qNode节点都被回收了。所以当这n个线程同时竞争其中的一把锁L2时,增加的节点只有锁创建时新建的qNode节点,其余的复杂度和L1一样。依次类推,可证:
有L把锁,n个线程,则CLH锁的空间复杂度为O(n+L)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,372评论 11 349
  • 又是一年高考时# 今年的考试特别不一样,因为这是我正式踏入职场以后的的一次高考;不仅如此,家中的堂弟也是在今年高考...
    kiki祺阅读 196评论 0 0
  • 最美苏木山,醉心一日游,最真同学情 2017年10月14日,同学们相聚在美丽的苏木山,实现了盼望已久的户外游。...
    冰轮1阅读 427评论 0 0