This question already has answers here:
What is the difference between atomic / volatile / synchronized?

(7个答案)


1年前关闭。




我知道volatile允许可见性,AtomicInteger允许原子性。
因此,如果我使用volatile的AtomicInteger,是否意味着我不必再使用任何同步机制了?

例如。
class A {

    private volatile AtomicInteger count;

    void someMethod(){
        // do something
        if(count.get() < 10) {
            count.incrementAndGet();
        }
}

这是线程安全的吗?

最佳答案

我相信Atomic*实际上既提供了原子性又提供了波动性。因此,当您调用(说)AtomicInteger.get()时,可以确保获得最新值。这记录在java.util.concurrent.atomic package documentation中:

现在如果你有

volatile AtomicInteger count;
volatile部分意味着每个线程将使用最新的AtomicInteger引用,而它是AtomicInteger的事实意味着您还将看到该对象的最新值。
不需要这个是不常见的(IME)-因为通常您不会重新分配count来引用另一个对象。相反,您将拥有:
private final AtomicInteger count = new AtomicInteger();
那时,它是final变量这一事实意味着所有线程都将处理同一对象-并且它是Atomic*对象这一事实意味着它们将在该对象中看到最新值。

关于java - AtomicInteger和volatile ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14338533/

10-09 04:08