起源
CLH队列锁即Craig, Landin, and Hagersten (CLH) locks
CLH队列锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程仅仅在本地变量上自旋,它不断轮询前驱的状态,发现前驱释放了锁就结束自旋。
成员
每个线程在同步队列都可以相当于MNode mpred指向前置借点,locked 标识是否需要节点是否需要获取锁
如下:
正如我们看到的,MNode,是以队列的形式排列,Pred 以自旋转的方式指向前的线程节点,当一个线程需要释放锁时,将当前结点的locked域设置为false,同时回收前驱结点,
使用
CLH队列锁的优点是空间复杂度低(如果有n个线程,L个锁,每个线程每次只获取一个锁,那么需要的存储空间是O(L+n),n个线程有n个myNode,L个锁有L个tail)
- Java中的AQS是CLH队列锁的一种变体实现