🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### CLH锁\(StampedLock内部实现\) CLH锁即Craig, Landin, and Hagersten \(CLH\) locks,CLH锁是一个自旋锁,能确保无饥饿性,提供先来先服务的公平性。 CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。 CLH队列:带头结点的双向非循环链表\(如下图所示\): ![](https://img.kancloud.cn/7d/2f/7d2fad3cd693da8817b97019cf8b3179_614x293.png) ### 实现原理 ReentrantLock的基本实现可以概括为:先通过CAS尝试获取锁。如果此时已经有线程占据了锁,那就加入CLH队列并且被挂起。当锁被释放之后,排在CLH队列队首的线程会被唤醒,然后CAS再次尝试获取锁。在这个时候,如果: * 非公平锁:如果同时还有另一个线程进来尝试获取,那么有可能会让这个线程抢先获取; * 公平锁:如果同时还有另一个线程进来尝试获取,当它发现自己不是在队首的话,就会排到队尾,由队首的线程获取到锁。 ``` Lock lock1 = new ReentrantLock(); // 非公平锁 Lock lock2 = new ReentrantLock(false); // 公平锁 ```