不知道为什么有这么多人在测试 volatile 的作用的时候喜欢用 println 这个方法,然后因为 println 方法的特殊性就得出一个结论,volatile 其实加和不加都一样。 首先,println 内部有 synchronized ,它的特殊性指的就是这一点。这会导致缓存失效,进而导致变量的重新读取,无论加没加 volatile 。
while(aBoolean){
System.out.println("running");
}
上面这种方式检验 volatile 是绝对错误的! 正确的方式是
while(aBoolean){}
System.out.println("done");
这将导致线程永远空转,而加了 volatile 之后就可以正确的输出 done
1
L4Linux 2022-12-04 01:25:15 +08:00 via Android
println 的 synchronized 只保证输出的原子性吧,管得着方法外的变量吗?你不妨举例说说其它 threads 有怎样的代码。
|
2
wangyu17455 OP @L4Linux
Concurrent Programming in Java 里说了啊 In essence, releasing a lock forces a flush of all writes from working memory employed by the thread, and acquiring a lock forces a (re)load of the values of accessible fields. While lock actions provide exclusion only for the operations performed within a synchronized method or block, these memory effects are defined to cover all fields used by the thread performing the action. 是当前作用域的所有变量都 reload from memory |