2017-05-26 100 views
0

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

这里的示例代码:

公共无效的run(){

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

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

为什么不使用'CountDownLatch'? – Bohemian

+0

不想要任何等待的线程。将计数器对象作为监视器传递给所有正在执行的线程。 – V1666

+0

在使用一个时不必阻塞线程:'getCount()'返回当前计数。只有'await()'块。 – Bohemian

回答

2

package summaryjava.util.concurrent.atomic

用于访问和原子能的更新通常遵循规则的记忆效应用于挥发物,如The Java Language Specification (17.4 Memory Model)中所述:

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

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

+0

惊人的读取文档是多么有用! –

+0

谢谢。所以,将继续采用这种方法。 – V1666

相关问题