我应该声明java.util.concurrent.ConcurrentLinkedQueue引用volatile吗?

时间:2013-12-31 14:58:41

标签: java concurrency thread-safety volatile

我使用java.util.concurrent.ConcurrentLinkedQueue对象在线程之间传递数据。

我应该声明我的参考资料volatile吗?

3 个答案:

答案 0 :(得分:4)

简而言之,没有。

队列变量包含的值是对队列的引用。除非你像myQueue = otherQueue;那样重新分配队列,否则这个值不会改变。如果您正在做的就是创建队列,那就是把事情放进去并把事情搞砸了,那么线程是否有缓存值并不重要,因为value(对队列的引用)永远不会改变。

最好将所有变量设为最终,除非你需要它不是最终的。

答案 1 :(得分:1)

不,因为您总是使用相同的队列。易失性意味着内存中变量的值对于每个处理器总是相同的。请注意,即使将变量声明为volatile,也不会同步存储在寄存器中的变量。

答案 2 :(得分:1)

如果你可以宣告它是最终的,那么宣布它是最终的。如果你不能,宣布它是不稳定的。

声明它的volatile不会对Queue的内部结构产生影响。它只在分配a new ConcurrentLinkedQueue()

时添加了额外的同步