在使用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 ...

最佳答案

是的,可见性如您所愿,正如您从CyclicBarrier类的javadoc中看到的那样:


  内存一致性影响:调用await()之前的线程中的操作发生在屏障操作的一部分之前,而其他操作又发生在其他线程中的相应await()成功返回之后的操作之前。

关于java - 在CyclicBarrier上进行可见性同步?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17897732/

10-11 21:36