我正在使用一个java.util.concurrent.ConcurrentLinkedQueue
对象在线程之间传递数据。
我应该将我的引用声明为volatile
吗?
我正在使用一个java.util.concurrent.ConcurrentLinkedQueue
对象在线程之间传递数据。
我应该将我的引用声明为volatile
吗?
myQueue = otherQueue;
否则这个值不会改变。如果你创建了队列后所做的所有操作都只是往里面添加和取出东西,那么线程是否有缓存的值并不重要,因为这个值(指向队列的引用)永远不会改变。null
变成了其他值。但是,只有在构造函数和任何实例初始化程序执行完成之前,如果该值对任何其他线程可观察到才会产生影响。 - Robin Greennew ConcurrentLinkedQueue()
时才会添加额外的同步。
final
更为合适? - Jared Lindseyvolatile
和final
一样,不会对所引用的对象产生任何影响,只会影响引用本身。只有在计划替换整个队列对象时才需要将其设置为volatile
。 - Peter Lawrey