假设我们有一个列表参考:
volatile List<Object> a;
现在线程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)
然后线程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.
“o”是否保证引用线程1添加的字符串?或者我错过了什么?假设线程1中的代码在线程2的代码之前执行。
答案 0 :(得分:9)
“o”是否保证引用线程1添加的字符串?
如果您可以保证除了您明确提到的那些之外没有其他跨线程操作将会针对您的列表提交,那么是的,您有所要求的保证。
如果任何线程在通过volatile
变量发布后对列表进行了变更,则不再有线程间保证。
答案 1 :(得分:0)
是,如果Thread1在Thread2之前执行,那么它将提供保证。