常听人说,在32位的机器上对long型变量进行加减操作存在并发隐患,到底是不是这样呢?
非volatile类型的long和double型变量是8字节64位的,32位机器读或写这个变量时得把人家咔嚓分成两个32位操作,可能一个线程读了某个值的高32位,低32位已经被另一个线程改了。所以官方推荐最好把long\double 变量声明为volatile或是同步加锁synchronize以避免并发问题。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.7