一,官方描写叙述


一个基于连接节点的无界线程安全队列。这个队列的顺序是先进先出。队列头部的元素是留在队列中时间最长的,队列尾部的元素是留在队列中时间最短的。新元素被插入到元素的尾部,队列从队列的头部检索元素。当很多线程共享訪问同一个集合时,这个类是不二选择。这个队列不同意有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类的深入分析与理解的更多相关文章

  1. Java遍历包中所有类

    PackageUtil 类 import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java. ...

  2. 27 Java动态加载第三方jar包中的类

    我加载的方法是://参数fileName是jar包的路径,processorName 是业务类的包名+类名public static A load(String fileName, String pr ...

  3. 集合框架的类和接口均在java.util包中。 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。

    集合框架的类和接口均在java.util包中. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换.

  4. Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

  5. Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等

    从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...

  6. Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

    通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneI ...

  7. Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

    目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总 ...

  8. Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate

    通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用ja ...

  9. Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全

    通过Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter, 可以看出java8的DateTimeFormatter完美解决 ...

随机推荐

  1. Oracle EBS-SQL (WIP-8):检查期间任务下达记录数.sql

    select       WE.DESCRIPTION                                                                        任 ...

  2. hdu 5586 Sum(dp+技巧)

    Problem Description There )mod10007.After that,the sum of n numbers should be as much as possible.Wh ...

  3. 饿了么移动APP的架构演进(转)

    原文:http://www.jianshu.com/p/2141fb0dc62c 文/圣迪(简书作者)原文链接:http://www.jianshu.com/p/2141fb0dc62c著作权归作者所 ...

  4. ubuntu系统下设置静态IP

    改动 /etc/network/interfaces文件 加入下面内容 # The loopback network interface auto lo eth0 iface lo inet loop ...

  5. POJ1042 Gone Fishing

    采用贪心策略. 假设他从1湖泊走到x 湖泊,这还剩下 h*12 - sigma(T1--Tx-1).(单位时间为5分钟).然后再用剩下的时间去钓1-x的湖泊的鱼. 每次都选择最多鱼的湖泊钓. code ...

  6. poj2762 Going from u to v or from v to u?

    Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13040 ...

  7. Codeforces Round #256 (Div. 2/C)/Codeforces448C_Painting Fence(分治)

    解题报告 给篱笆上色,要求步骤最少,篱笆怎么上色应该懂吧,.,刷子能够在横着和竖着刷,不能跳着刷,,, 假设是竖着刷,应当是篱笆的条数,横着刷的话.就是刷完最短木板的长度,再接着考虑没有刷的木板,,. ...

  8. SQL中的去重操作

    if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] ),[Memo] nvarchar()) In ...

  9. ios 中的构造方法

    构造方法 1.什么是构造方法? 初始化对象的方法. 默认情况下,在 OC 当中创建1个对象分为两部分(new 做的事): +alloc:分配内存空间 -init :初始化对象 2.构造方法的作用是? ...

  10. Linux学习之查找命令汇总

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...