以前觉得线程安全,总是需要用synchronized实现。
看JDK帮助文档(1.5以上),说ConcurrentLinkedQueue是线程安全的队列,但是看它的源码,似乎没有什么synchronized。感觉挺新鲜的。线程安全必须要通过synchronized实现吗?
ConcurrentLinkedQueue是如何实现线程安全的?
有没有大神给解个惑,详细解释下呢?

解决方案 »

  1.   

    线程安全不一定必须用synchronized
      

  2.   

    synchronized只是实现线程安全的一个手段.而且在很多情况下是代价最大的方法(并发性能下降严重).
    所以有很多轻量级实现线程安全的手段,
    语法方面有volatile,类库方面有java.util.concurrent包
    ConcurrentLinkedQueue是通过cas操作来实现线程安全的.
    以offer方法举例,简单来说,offer方法在一个无限循环中使用cas操作来向队尾插入节点,如果插入成功,则返回true跳出循环,如果插入失败,则继续循环直到成功,这样的方式就不用加任何锁也能保证并发情况下是线程安全的.
    另外这里说的ConcurrentLinkedQueue这个类只是有条件的线程安全.LZ如果对java并发有兴趣的话,可以看下《java concurrent in practice》这本书
      

  3.   


    受教了,回去看看你推荐的材料~
    它的无限循环的思路,是不是插入失败,就一直循环插入,直到成功了就return是吧?
    另外,我理解concurrent只是一个概念,用这种思路实现的类,都放到这个包里了,并不存在某个具体的抽象类或者操作,是这个意思把?
      

  4.   


    cocurrent可以看成一个概念,更确切的说是个编程领域问题.
    java.util.cocurrent包中就包含了一些在java中更方便高效解决这个问题的一些工具类和接口.
      

  5.   

    下面这篇说的很好,可以看看。
    https://www.ibm.com/developerworks/cn/java/j-lo-concurrent/