看啥推荐读物
专栏名称: 进击的Java新人
目录
相关文章推荐
今天看啥  ›  专栏  ›  进击的Java新人

用Atomic实现可以等待的锁

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

原文地址:访问原文地址
快照地址: 访问文章快照