Java CLH队列锁

332 阅读1分钟

起源

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队列锁的一种变体实现