int/long变量的赋值,到底是不是原子操作吗?
常见的说法就是说int类型没问题,但long类型8字节,可能一个线程赋值时,刚写完4字节,另一线程就已经读取了,所以说不是原子操作。
而我看到JDK的AtomicLong类中的set()方法,是直接赋值,没有什么同步之类的操作,那么多线程操作AtomicLong,岂不是会出现刚才说的那种情况?
public final void set(long newValue) {
value = newValue;
}
------解决方案--------------------JDK说明:
public class AtomicLong
extends Number
implements Serializable
可以用原子方式更新的 long 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicLong 可用在应用程序中(如以原子方式增加的序列号),并且不能用于替换 Long。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。
AtomicLong是原子的,Long不是原子操作的。
------解决方案--------------------int 赋值怎么不是原子的。
不同步的是
代码块。