-
在SMP架构下,CLH更具有优势。
-
在NUMA架构下,如果当前节点与前驱节点不在同一CPU模块下,跨CPU模块会带来额外的系统开销,而MCS锁更适用于NUMA架构。
加锁逻辑
1.获取当前线程的锁节点,如果为空,则进行初始化;
2.同步方法获取链表的尾节点,并将当前节点置为尾节点,此时原来的尾节点为当前节点的前置节点。
3.如果尾节点为空,表示当前节点是第一个节点,直接加锁成功。
- 如果尾节点不为空,则基于前置节点的锁值(locked==true)进行自旋,直到前置节点的锁值变为false。
解锁逻辑
-
获取当前线程对应的锁节点,如果节点为空或者锁值为false,则无需解锁,直接返回
-
同步方法为尾节点赋空值,赋值不成功表示当前节点不是尾节点,则需要将当前节点的locked=false解锁节点。如果当前节点是尾节点,则无需为该节点设置。
public class CLHLock {
<