上一篇文章我们讲到如何使用Atomic实现自旋锁。如果关键区的执行时间很短,往往自旋等待会是一种比较高效的做法,它可以避免线程的频繁切换和调度。但如果关键区的执行时间很长,那这种做法就会大量地浪费CPU资源。为了解决这个问题,我们可以做这样的改进:当一个线程拿不到锁的时候,就让这个线程先休眠等待。这样,CPU就不会白白地空转了。第一个方案思考一下,做这样的改进,我们需要哪些东西?需要一个容器,如果线程抢不到锁,就把线程挂起来,并记录到这个容器里。当一个线程放弃了锁,得从容器里找出一个挂起的线程,把它恢复了。这是最基本的两个东西,我们先来实现一下。class WrongBlockLock implements Lock {
private AtomicInteger state = new AtomicInteger(0);
// 先借用一下JDK里的无锁队列
private ConcurrentLinkedQueue<Thread> waitList
………………………………