【发布时间】:2018-11-08 20:01:17
【问题描述】:
假设我有以下内容:
char[] shared = new char[]{'a', 'b'};
ExecutorService exec = Executors.newCachedThreadPool();
Future<?> f1 = exec.submit(() -> shared[0] = 'A');
Future<?> f2 = exec.submit(() -> shared[1] = 'B');
f1.get(); f2.get();
System.out.println(shared);
我希望这通常会打印出来:
'AB'
但是这个也可以打印吗:
'aB'
或
'bA'
我想知道由于shared 不是易失性的,一个线程可能在将其更改保存到其相应的 char 元素时,保存其在其本地处理器缓存中已过时的相邻字节,然后踩踏另一个线程所做的更改。我感觉这个问题的答案是“不”,因为我认为这会违反 Java 的内存模型,该模型说,每当一个线程被加入时,它所做的所有动作都发生在加入之前。但如果是这样的话,那么我很好奇这是如何防止的?我的理解是,当字节被刷新时,整个缓存行都会被刷新,我想一个 char[] 数组会有多个元素位于同一个缓存行中。
【问题讨论】:
-
我认为您的意思是
shared[0]和shared[1]而不是char[0]和char[1]? -
糟糕。固定的。谢谢!
标签: java multithreading java-memory-model