原子变量是否保证 - “在关系之前发生”?

时间:2017-05-26 00:01:42

标签: java concurrency java-memory-model compare-and-swap

我有一个要求,我需要在完成后发布'n'个线程的结果。为了检查是否所有线程都已完成,我使用的是AtomicInteger(incrementAndGet())并将其值与最终变量进行比较。在进行检查之前,我正在将单个线程的结果写入共享对象(到并发哈希映射,因为非同步数据结构dint似乎是足够的)。所以,我的问题是,在我的计数器通过'if'条件之前,所有线程是否都会完成写入共享对象(并且主线程能够看到一致的内存)吗?

以下是示例代码:

public void run(){

    //Values is a concurrent hashMap. 
    values.put(Thread.currentThread().getName(), Thread.currentThread().getName());

    if(counter.incrementAndGet() == 5) {
        //Do something
    }
}

1 个答案:

答案 0 :(得分:2)

请参阅java.util.concurrent.atomic的{​​{3}}:

  

访问和更新原子的记忆效应通常遵循挥发性规则,如package summary中所述:

     
      
  • get具有读取volatile变量的记忆效应。
  •   
  • set具有写入(分配)volatile变量的记忆效应。
  •   

incrementAndGet()包含set和get操作,这意味着你有一个完整的发生在边缘。