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;
}
}java并发编程上写着可能 一直循环或输出0 输出0 我理解 一直循环是为什么啊 主线程和分出的线程不是会一起执行吗 ,那ready应该会为true的啊
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;
}
}java并发编程上写着可能 一直循环或输出0 输出0 我理解 一直循环是为什么啊 主线程和分出的线程不是会一起执行吗 ,那ready应该会为true的啊
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;
}
}
如果while (ready) ready是true的话会永远执行,进入死循环
当主线程把ready改为true之后,分线程就会终止。但并发运行意味着你无法预测在主线程把ready改为true之前分线程已经执行了多少次循环。
尽管是随机的 但无论如何 ,最后ready都会为true 那书上为什么说还会进入死循环 求解
但是,这与操作系统,CPU,JVM的实现等都是密切相关的想看到死循环这种结果是很难的,尤其是在sun hotspot虚拟机的-client模式下,更是比买彩票中一个亿的几率还小,但这是没有任何保证的,所以为确保不会出现那亿分之一的可能性,就要用同步
因为主线程修改ready的目的就是给另一个线程看的,另一个线程只是读取ready,而且是作为标志使用
。
while{!ready)
Thread.yield();
运行完之后一定是ready=true;
而此时主线程已经运行了number=42,从而保证子线程打印System.out.println(number);的结果一定是主线程赋值number为42后的值