ConcurrentLinkedQueue问题

时间:2010-01-07 13:42:26

标签: java concurrency

请问您是否需要使用显式同步或锁来使用ConcurrentLinkedQueue?我特别感兴趣的是知道是否需要同步调用来跟随ConcurrentLinkedQueue方法。

  • 添加
  • 明确
  • 尺寸

可能size是唯一可能需要显式同步的方法,因为它不是原子方法,而是ConcurrentLinkedQueue java docs说

  

“请注意,与大多数人不同   集合,大小方法不是   恒定时间操作。因为   这些的异步性质   队列,确定当前号码   元素需要遍历   要素。 “

这让我相信虽然大小调用可能很慢,但它不需要任何明确的同步调用。

提前致谢...

5 个答案:

答案 0 :(得分:4)

clear()不是原子操作(它在AbstractQueue类中实现),因为Javadoc和source说:“这个实现重复调用poll直到它返回null。” poll是原子的,但是如果你在clear()正在进行时使用offer,你将在清除过程中添加一些东西,而clear()将删除它......

如果你使用clear(),你应该使用LinkedBlockingQueue而不是ConcurrentLinkedQueue。

答案 1 :(得分:2)

您不需要任何显式同步或锁定。作为the docs状态,它是线程安全的集合。这意味着这些方法中的每一个都是正确的原子(虽然你指出,size()可能很慢)。

答案 2 :(得分:0)

您不应该也不需要对任何这些方法使用显式锁定。

答案 3 :(得分:0)

是的,您不需要使用显式同步,因为这是一个线程安全的集合。允许任何并发访问而无需担心

答案 4 :(得分:0)

不必同步以保留队列的内部结构。但是,可能需要线性化结构的其他不变量。

例如size()在任何共享的可变容器中都没有任何意义。所有它能告诉你的是你最后一次问什么,而不是它现在是什么,除非你停止世界并防止并发修改。它仅对指示性监视目的有用,您永远不会在算法中使用它。

同样,如果没有某种外部干预,clear()并没有多大意义。清楚什么?你打电话清楚时它里面的东西?在并发结构中回答 是一个困难的问题。

所以,你最好将它用作一个简单的线程安全队列(仅提供和轮询),并且除非你从外部锁定,否则转向其他队列。