关于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完美解决 ...
随机推荐
- JQuery DataTables Editor---页面内容修改&&数据库信息修改 (1)
我们使用jquery datatables 不光是为了对数据的展示,同时需要对数据惊行简单的操作,这个操作分为两个部分:1.页面内容的修改:2.对应的数据库信息的修改. 前一篇博文介绍了页面级的操作, ...
- linux下监视进程 崩溃挂掉后自动重启的shell脚本
如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务程序时经常会碰到这样的问题.在Linux系统中,强大的shell就可以很灵活的处理这样的事务. 下面的shell通过一个while-d ...
- unity3d银联支付出现闪退
在接入银联SDK的unity3d的游戏中,点击银联支付会出现游戏总是出现闪退现象 ,后来网上有资料说 打开银联的jar包,将里面的res/drawable目录下的文件,拷贝到您的工程的drawable ...
- 将Dictionary序列化为json数据 、json数据反序列化为Dictionary
需要引用System.Web.Extensions dll类库 /// <summary> /// 将json数据反序列化为Dictionary /// </summary> ...
- 不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】
由微软 ASP.NET 团队|2008 年 8 月 19 日 推特 在本教程中,您将学习在不同版本的 Internet Information Services 中如何使用 ASP.NET MVC 和 ...
- checkbox和radio的样式美化问题
如果你下定决心要改变现有的默认的checkbox和radio的样式,那么我目前有两种办法: 1.自己动手写一个,也就是自己写代码实现将input的checkbox和radio默认的样式隐藏掉,使用绝对 ...
- 如何生成log新信息背景图片和在图片上添加水印
在图片上添加文字水印,其实就是要用到两个类, using System.Drawing; using System.Drawing.Drawing2D; 废话不多说了,直接上代 ...
- HTML5 元素拖放
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 自学php的几个例子(包含AMP(Apache、MySQL、PHP)环境搭建链接)
学习PHP之前需要先搭建PHP运行的环境(即服务器+PHP+数据库)来使PHP成功运行,具体环境搭建教程可参考pharen(http://www.cnblogs.com/pharen/archive/ ...
- C#中的USB库 WinUSB
NET C#中的USB库WinUSB,的libusb - Win32和的libusb - 1.0.使用公共设备类,应用程序与所有未经修改的操作系统和驱动程序.大量的示例代码. http://sourc ...