是否足够易变以更改列表的引用?

Jan*_*nek 5 java concurrency volatile

假设我们有一个列表参考:

volatile List<Object> a;
Run Code Online (Sandbox Code Playgroud)

现在线程1初始化它:

List<Object> newA = new LinkedList<>();
newA.add(new String("a"));
a = newA; // Write to a volatile (equivalent to exiting a synchronized block in terms of memory barriers)
Run Code Online (Sandbox Code Playgroud)

然后线程2做:

Object o = a.get(0); // Compound operation - first we read a volatile reference value, then invoke .get() method on it. Read to a volatile is equivalent to entering a synchronized block.
Run Code Online (Sandbox Code Playgroud)

"o"是否保证引用线程1添加的字符串?或者我错过了什么?假设来自线程1的代码在来自线程2的代码之前执行.

Mar*_*nik 9

"o"是否保证引用线程1添加的字符串?

如果您可以保证除了您明确提到的那些之外没有其他线程间操作将会针对您的列表提交,那么是的,您有所要求的保证.

如果任何线程在通过volatile变量发布后突变列表,则不再有线程间保证.