Java在多线程情况下访问外部一个基本变量,如果不加volatile可能读到的值是失效的,但至少是之前某个线程设置的值,不是一个无从生有的值。
但这只是针对int,float, boolean 这类32位的变量类型来说的,如果遇到64位的long和double,JVM读取它们是可能分解成2个32位的来运算的,读取和设置都是可能拆分进行的,所以没有volatile修饰,读到的高位32位和地位32位值有可能不属于同一个long或double的,结果会给人呈现读到来一个不存在的值的幻想。
所以多线程访问外部变量都要加volatile,尤其double和long这种64位的类型,当然也可以用锁来锁住操作的方法。
网友评论