日期:2014-05-20  浏览次数:20721 次

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

线程安全必须要通过synchronized实现吗?
ConcurrentLinkedQueue是如何实现线程安全的?
有没有大神给解个惑,详细解释下呢?

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

LZ如果对java并发有兴趣的话,可以看下《java concurrent in practice》这本书
------解决方案--------------------
死锁、无锁算法,并发安全问题等,请关注:并发编程网