为什么在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)没有原子方法? 谢谢!
答案 0 :(得分:0)
因为AtomicInteger
为必须是原子的操作提供了public final int getAndSet(int newValue)
之类的其他方法。
答案 1 :(得分:0)
该操作本身就是automic,因为它只有一条指令。因此,与getAndSet
等其他方法不同,不需要任何同步,文档也说它们已经确保原子化工作。
答案 2 :(得分:0)
对变量的写入或读取本身就是一个原子操作 - 除了long
和double
s之外(参见JLS §17.7)。
除了value
字段被声明为volatile
之外,这使得获取和设置值是线程安全的,因为" Java内存模型确保所有线程都看到一致的值变量" (见JLS §8.3.1.4)。此外,在处理volatile变量时,还有一个发生在之前的关系(参见JLS §17.4.5)。
这意味着方法get
和set
本身就是原子操作,没有任何进一步的同步机制。其他操作 - 例如getAndSet
或compareAndSet
- 必须使用一些进一步的同步机制来确保原子性。