自旋锁--CLH锁

CLH锁的实现

自旋锁--CLH锁_第1张图片
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锁_第2张图片
CLH-Lock-2.png

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

你可能感兴趣的:(自旋锁--CLH锁)