使用CyclicBarrier在Java中同步线程时,它们是否同步非易失性变量?
int a = 0;
int b = 0;
CyclicBarrier barrier = new CyclicBarrier(2);
/*** Thread 1 ***/
public void run() {
a = 2;
barrier.await();
doSomeStuff(b); // no side-effects
}
/*** Thread 2 ***/
public void run() {
b = 3;
barrier.await();
doSomeStuff(a); // no side-effects
}
我们可以确定在线程1的doSomeStuff呼叫b已被设置为3吗? 在尝试时总是3 ...
答案 0 :(得分:1)
是的,可见性正如您所期望的那样发生,正如您可以从javadoc中看到的CyclicBarrier类:
内存一致性效果:调用await()之前的线程中的操作发生在作为屏障操作一部分的操作之前,而操作又发生在其他线程中从相应的await()成功返回之后的操作之前。