CyclicBarrier的可见性同步?

时间:2013-07-27 12:17:51

标签: java synchronization visibility cyclicbarrier

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

1 个答案:

答案 0 :(得分:1)

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

  

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