在阅读实践中的并发性时,我读到:
NoVisibility
展示了一种不充分的方法
同步程序可能会导致令人惊讶的结果:陈旧的数据。当。。。的时候
读者线程检查ready
,它可能会看到一个过时的值。除非
每次访问变量时都会使用同步,这是
可能会看到该变量的过时值。更糟糕的是,陈旧性是
不是全部或全无:线程可以看到一个变量的最新值
但首先写入的另一个变量的陈旧值。
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true;
}
}
我不明白陈旧的含义。两个线程共享相同的引用,一个线程修改的值如何对其他线程可见或不可见?
每个线程都有它的自己的堆栈,所以它可以有自己的变量副本
使用权。当线程创建时,它会复制所有的值
可以在自己的内存中访问变量。使用了 volatile 关键字
对 jvm 说“警告,该变量可能会在其他变量中被修改
线“。如果没有这个关键字,JVM 可以自由地做出一些
优化,例如永远不会让人耳目一新一些本地副本
线程。易失性强制线程更新原始变量
对于每个变量。
Source DZone
硬件实现
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)