关于java同步包中ConcurrentLinkedQueue类的深入分析与理解
一,官方描写叙述
一个基于连接节点的无界线程安全队列。这个队列的顺序是先进先出。队列头部的元素是留在队列中时间最长的,队列尾部的元素是留在队列中时间最短的。新元素被插入到元素的尾部,队列从队列的头部检索元素。当很多线程共享訪问同一个集合时,这个类是不二选择。这个队列不同意有null元素。
这个实现基于一种被描写叙述为简单,高速,有用的非堵塞和堵塞发布队列算法而提供的一种有效的空暇等待算法。
注意,不像大多数集合,size方法的操作不是常量时间的,因为是异步队列,决定了元素的数量须要遍历真个元素集。
这个类和它的迭代器实现了Collection和Iterator接口的全部可选方法。
二,源代码分析
例如以下代码所看到的,这个类继承了AbstractQueue抽象类,实现了Queue和Serializable接口。
public class ConcurrentLinkedQueue<E> extends AbstractQueue<E>
implements Queue<E>, java.io.Serializable
分析这个类的源代码,必须先从它的静态内部类Node開始。在Node类中,Node的插入和比較操作都是使用底层的Unsafe类来完毕的,也就是说,这个Node类自身已经是线程安全的。
在这个类的变量中,head和tail对象是使用volatile来修饰的,我前面的一片文章中说过,volatile是线程安全的,但不是原子操作。在这个类中,因为每一个Node变量都是volatile修饰,因此使用指针获取next或者previous节点时,也是线程安全的。
在这个类中须要注意size方法,源码例如以下:
public int size() {
int count = 0;
for (Node<E> p = first(); p != null; p = succ(p))
if (p.item != null)
// Collection.size() spec says to max out
if (++count == Integer.MAX_VALUE)
break;
return count;
}
从以上源码能够看出,获取size的时间并非常量时间,而是O(n)时间。这也是一种以时间换取安全性的折中策略。
在分析源代码时你会发现,像这个类中得remove,peek,pool等操作中都没有锁或者其他持有线程安全的条件,事实上它这里的线程安全,所有都在Node静态类中完毕了,由于在这个源代码中无论你用哪一个方法,事实上都是会调用Node中的next,而Node中得方法都是线程安全的,因此这些操作也都是线程安全的。
三,总结
1,这个类是基于队列的链表,即先进先出原则
2.这个类的size方法花费O(n)时间
3.这个类是线程安全的,它的Iterator也是线程安全的
关于java同步包中ConcurrentLinkedQueue类的深入分析与理解的更多相关文章
- Java遍历包中所有类
PackageUtil 类 import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java. ...
- 27 Java动态加载第三方jar包中的类
我加载的方法是://参数fileName是jar包的路径,processorName 是业务类的包名+类名public static A load(String fileName, String pr ...
- 集合框架的类和接口均在java.util包中。 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。
集合框架的类和接口均在java.util包中. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换.
- Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等
从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...
- Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。
通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneI ...
- Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析
目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总 ...
- Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate
通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用ja ...
- Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
通过Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter, 可以看出java8的DateTimeFormatter完美解决 ...
随机推荐
- 汽车总线obd模拟器,obd仿真器,ecu模拟器,obd开发测试工具,可以模拟ecu中的obd协议 MRD-5050
汽车总线OBD模拟器MRD-5050型号是在车辆越来越趋于网络化的趋势下研发的,是汽车产品开发.调试.生产必备的工具,能为为开发人员节省大量的时间.当前车辆上的总线设备越来越多,有的高端车上甚至多到有 ...
- License制作
最近,部门的产品要做license,于是上网查了一些通用软件的License做法,拿过来学习一下. 一个老外写的,很好,几乎完全涵盖了软件License的制作流程 http://afewguyscod ...
- 探究android控件及布局
控件(widget) 1. TextView(该控件的一些需要注意的属性,下同) gravity="center"textSize="24sp"textColo ...
- LDA Gibbs Sampling
注意:$\alpha$和$\beta$已知,常用为(和LDA EM算法不同) 1. 为什么可用 LDA模型求解的目标为得到$\phi$和$\theta$ 假设现在已知每个单词对应的主题$z$,则可 ...
- Centos6.5 telnet wireshark
yum -y install telnet-server telnet vim /etc/xinted.d/telnet disable = no vim /etc/pam.d/remote #aut ...
- Ubuntu之修改用户名和主机名
记得曾几何时,想把自己电脑的“乌班兔儿”取个响亮的名字,但是问了很久度娘和谷哥,都要我把当前用户删除了(userdel -r xxx),重新建一个用户(adduser xxx),但是,我的电脑是所有环 ...
- linux学习之(六)-主机名、网络IP的配置与查看
设置Linux 本机IP有一个非常好用的命令就是setup命令,在Linux终端打入setup命令就会打开Linux配置窗口,如下图: . 在打开的窗口中通过上下键选择 Network config ...
- Java NIO——2 缓冲区
一.缓冲区基础 1.缓冲区并不是多线程安全的. 2.属性(容量.上界.位置.标记) capacity limit 第一个不能被读或写的元素 position 下一个要被读或写的元素索引 mark ...
- UITabBarController 笔记(二) ViewController中加UITabBarController
新建一个简单视图iOS工程,在ViewController的viewDidLoad中代码如下 - (void)viewDidLoad { [super viewDidLoad]; // Do any ...
- java中文乱码解决之道(一)—–认识字符集
原文出处:http://cmsblogs.com/?p=1395 沉寂了许久(大概有三个多月了吧),LZ“按捺不住”开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要 ...