【每日阅读】2020年10月18日-ConcurrentLinkedQueue

真诚的希望您能留言与我交流,这会对我有非常大的帮助!

文章

《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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

GitHub
分享本页
返回顶部