1

When using a CyclicBarrier for synchronizing threads in Java, do they synchronize non-volatile variables?

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
}

Can we be sure that on Thread 1's doSomeStuff call b has been set to 3? When trying it's always 3...

4

1 回答 1

1

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

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

于 2013-07-27T12:52:38.120 回答