AtomicInteger设置方法是Atomic?

时间:2018-04-30 07:06:22

标签: java

为什么在AtomicInteger或其他Atomic类中定义了这个set方法?

示例代码:

 /**
 * Sets to the given value.
 *
 * @param newValue the new value
 */
public final void set(int newValue) {
    value = newValue;
}

/**
 * Sets to the given value.
 *
 * @param newValue the new value
 */
public final void set(V newValue) {
    value = newValue;
}

这个方法不是注释原子?这个set()方法意味着他不是原子的吗?

我不明白为什么AtomicInteger或其他Atomic(例如:AtomicReference)没有原子方法? 谢谢!

3 个答案:

答案 0 :(得分:0)

因为AtomicInteger为必须是原子的操作提供了public final int getAndSet(int newValue)之类的其他方法。

答案 1 :(得分:0)

该操作本身就是automic,因为它只有一条指令。因此,与getAndSet等其他方法不同,不需要任何同步,文档也说它们已经确保原子化工作。

答案 2 :(得分:0)

对变量的写入或读取本身就是一个原子操作 - 除了longdouble s之外(参见JLS §17.7)。

除了value字段被声明为volatile之外,这使得获取和设置值是线程安全的,因为" Java内存模型确保所有线程都看到一致的值变量" (见JLS §8.3.1.4)。此外,在处理volatile变量时,还有一个发生在之前的关系(参见JLS §17.4.5)。

这意味着方法getset本身就是原子操作,没有任何进一步的同步机制。其他操作 - 例如getAndSetcompareAndSet - 必须使用一些进一步的同步机制来确保原子性。