请问您是否需要使用显式同步或锁来使用ConcurrentLinkedQueue?我特别感兴趣的是知道是否需要同步调用来跟随ConcurrentLinkedQueue方法。
可能size是唯一可能需要显式同步的方法,因为它不是原子方法,而是ConcurrentLinkedQueue java docs说
“请注意,与大多数人不同 集合,大小方法不是 恒定时间操作。因为 这些的异步性质 队列,确定当前号码 元素需要遍历 要素。 “
这让我相信虽然大小调用可能很慢,但它不需要任何明确的同步调用。
提前致谢...
答案 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()
并没有多大意义。清楚什么?你打电话清楚时它里面的东西?在并发结构中回答 是一个困难的问题。
所以,你最好将它用作一个简单的线程安全队列(仅提供和轮询),并且除非你从外部锁定,否则转向其他队列。