读《JAVA并发编程实战》 笔记
非volatile类型的64位数值变量(double和long)。在Java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非volatile类型的double和long变量,JVM允许将64位的读操作或写操作分解为两个32位的操作。当读取一个非volatile类型的long变量时,如果对该变量的读操作和写操作在不同的线程中执行,那么很可能会读取到某个值的高32位和另外一个值的低32位。
因此即使不考虑失效数据问题在多线程程序中使用共享且可变的long和double等类型的变量也是不安全的,除非用关键字volatile来声明它们或者用锁保护起来