当线程在没有固步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值。这种安全性保证也被称为最低安全性( out-of-thin-air safety)

最低安全性适用于绝太多数变量,但是存在一个例外:非volatile类型的64位数值变量。Java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非volatile类型的long和double变量,JVM允许将64位的读操作或写操作分解为两个32位的操作

当读取一个非volatile类型的long变量时,如果对该变量的读操作 和写操作在不同的线程中执行,那么很可能会读取到某个值的髙32位和另一个值的低32位

因此,即使不考虑失效数据问题,在多线程程序中使用共享且可变的long和double等类型的 变量也是不安全的,除非用关键字volatile来声明它们,或者用锁保护起来

 

但是在现在的主流商用虚拟机中,一般是能够将long和double的运算视为原子操作