问题:Java中的原子操作有哪些?long 和 double 的原子性你了解吗?
提示:
1)除long和double之外的基本类型(int, byte, boolean, short, char, float)的赋值操作
2)所有引用reference的赋值操作,不管是 32 位的机器还是 64 位的机器
3)java.concurrent.Atomic.* 包中所有类的原子操作
出于 Java 编程语言内存模型的目的,对非volatile修饰的long或double值的单次写入被视为两次单独的写入:一次写入32 位。这导致long和double的写入,并不是天然能具备原子性的。
官方文档对此的说明:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7
解决该问题的方法:加volatile修饰。