CLH锁简单解释
CLH队列是由Craig, Landin 和 Hagersten设计的队列。它是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。 首先,我们来看一下基础的检查并设置(test-and-set)自旋锁。假设锁是一个布尔值,我们用一个伪代码进行演示。 func acquire(lock): while true: if atomic_test_and_set(lock.flag): return 如果当前竞争很少的话,那这段代码的运行速度会非常快。但是如果有十个线程同时竞争同一个锁呢?你会有9个线程在不断尝试,这会消耗大量的CPU资源。我们有一些常用的方法可以减少这样的CPU浪费:队列锁。 队列锁意味着你给每个线程一个自有的锁,这样就不存在竞争了。然后你可以将它们连接在一起形成一个队列。这可能比较抽象,我们用一个例子来说明: 现在你想获取一个锁。首先你会试图将自己放入一个队列。如果放入成功,且队列为空,则你成功获取锁,这时候你会将自己标记为成功。如果放入成功,但是队列不为空,你会将自己标记为等待,并监听自己之前的节点。这个时候你可以选择自旋或者sleep。Java的AQS实现利用了sleep-waiting模式,避免自旋浪费CPU资源。 如果你获取锁成功,且使用完毕释放锁了。你会将自己成功标记去除 func acquire(lock, node): node->flag = true prev = node->prev = swap(lock, node) while node->flag:…