【发布时间】:2017-01-17 10:37:06
【问题描述】:
我很难理解 Java 中的内存屏障和缓存一致性,以及这些概念与数组的关系。
我有以下场景,一个线程修改一个数组(对它的引用和它的一个内部值),另一个线程从它读取。
int[] integers;
volatile boolean memoryBarrier;
public void resizeAndAddLast(int value) {
integers = Arrays.copyOf(integers, integers.size + 1);
integers[integers.size - 1] = value;
memoryBarrier = true;
}
public int read(int index) {
boolean memoryBarrier = this.memoryBarrier;
return integers[index];
}
我的问题是,这是否符合我的想法,即“发布”到memoryBarrier 并随后读取变量强制缓存一致性操作,并确保读取器线程确实会得到 both 最新的数组引用和指定索引处的正确基础值?
我的理解是数组引用不必声明为volatile,它应该足以使用any volatile 字段强制执行缓存一致性操作。这个推理正确吗?
编辑:恰好有一个写入线程和许多读取线程。
【问题讨论】:
标签: java multithreading volatile memory-barriers