索引
文章
《Java高并发程序设计 第2版》第132-138页。
所得
这一小节讲的是“高效读写的队列:深度剖析ConcurrentLinkedQueue”。了解到这个队列是Java内效率最高的队列,其内部使用CAS操作抛弃了锁所以实现了高性能。
其中有两个小点值得分享出来。
一、!=操作符
# 这行代码期望在t没有变的情况下,执行p=t,否则执行p=head p = (t != (t = tail)) ? t : head;
乍一看,发现前面的判断条件肯定是true啊,哪有t!=t的对不对。但是看了书中的分析才知道,这个!=判断操作,会先执行左边的,也就是取得t,然后再执行右边的把tail赋值给t,然后再比较取得的这两个值。在高并发情况下,很有可能在这两步中间有其他线程修改了tail的值,就会导致判断结果为false。
看了这个分析,感觉对Java的理解又深了一些。而且也发现这种无锁的程序是真的难写,没有深厚的知识积累是不可能想到要做这个判断的,那就很可能引入一个大BUG。
二、哨兵节点
这个概念不知道大学时老师讲过没,反正我是毫无印象,今天才知道这个概念。哨兵节点在队列中的概念是:next对象指向自己的节点。
理解了这个概念就行,这种节点的应用主要是在简化代码书写方式上。如果没有哨兵节点,那需要对一些边界节点做特殊处理,比如头尾节点。
知道这个概念就行,知道以后,我们在设计算法时如果要对边界做特殊处理,也可以考虑这种哨兵对象。
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/2605