CLH锁的实现
CLH锁的特点
- 使用链表来实现无界队列
- 使用两个
ThreadLocal
变量表示指针,一个指向自己的节点,一个指向前一个节点- 使用一个原子引用变量指向队尾
- 对同一个锁,一个线程可以多次获取而不增加空间复杂度
- 当线程结束后,GC会自动回收内存
CLH锁的空间复杂度
如果有L把锁,n个线程,则CLH锁的空间复杂度为O(n+L)。
解释:如果有L把锁,最多只使用其中的一把来保护共享数据的操作。对于这一点,可以参考读写锁的简单实现和使用为例进行理解:
考虑最坏情形,当n个线程同时竞争其中的一把锁L1,则根据
,则L1的空间复杂度为O(n+1)。当n个线程依次执行完共享数据操作后,除了
tail
指针还在引用着在锁创建时新建的qNode
节点外,其余的qNode
节点都被回收了。所以当这n
个线程同时竞争其中的一把锁L2时,增加的节点只有锁创建时新建的qNode
节点,其余的复杂度和L1一样。依次类推,可证:有L把锁,n个线程,则CLH锁的空间复杂度为O(n+L)。