不以文害辞,不以辞害志;以意逆志,是为得之。——孟子
最近在看ThreadPoolExecutor类的源码。我发现其中一个重要的子类Woker继承自AbstractQueuedSynchronizer(简称AQS)。AQS帮助Woker类轻松实现一个非重入的排它锁。不看不知道一看吓一跳,竟然有11个类继承自AQS,而且这些类都是并发包下面使用频率很高的类。这足以说明这个类的含金量,值得认真研究一下。
不以文害辞,不以辞害志;以意逆志,是为得之。——孟子
最近在看ThreadPoolExecutor类的源码。我发现其中一个重要的子类Woker继承自AbstractQueuedSynchronizer(简称AQS)。AQS帮助Woker类轻松实现一个非重入的排它锁。不看不知道一看吓一跳,竟然有11个类继承自AQS,而且这些类都是并发包下面使用频率很高的类。这足以说明这个类的含金量,值得认真研究一下。
SychronousQueue类的大部分代码都交给Transfer内部类的两个子类ThransferQueue和ThransferStack完成。我只写关于ThransferStack的代码。
优先阻塞队列,一定会涉及优先队列的实现,而且是平衡优先队列。一起看看Doug Lea大师是怎么做的。
两点疑问没有解决:
1、为什么ArrayBlockingQueue不使用takeLock、putLock的双锁机制?使用这种锁分离的策略明显效率更高。
2、为什么判断是否存在剩余空间,使用while 而不是if?难道作者怕出现意外,但是什么时候会出现意外呢?
线程切换线程8w个时钟周期。对于竞争不激烈的情况,使用循环使用CAS开销更小。
无锁操作在并发比较少的情况下效率高,但不要迷恋无锁。
CAS是CPU指令级别的原子操作,一条指令完成比较赋值过程,不用担心并发问题。
GYM是葛一鸣老师的简写。GYM系列文章都是观看葛老师课程的个人笔记。
GYM是葛一鸣老师的简写。GYM系列文章都是观看葛老师课程的个人笔记。