不知道为什么有这么多人在测试 volatile 的作用的时候喜欢用 println 这个方法,然后因为 println 方法的特殊性就得出一个结论,volatile 其实加和不加都一样。 首先,println 内部有 synchronized ,它的特殊性指的就是这一点。这会导致缓存失效,进而导致变量的重新读取,无论加没加 volatile 。
while(aBoolean){ System.out.println("running"); } 上面这种方式检验 volatile 是绝对错误的! 正确的方式是
while(aBoolean){} System.out.println("done"); 这将导致线程永远空转,而加了 volatile 之后就可以正确的输出 done
