public class Init {
static volatile boolean done = false;
static {
new Thread() {
public void run() {
System.out.println("enter thread");
done = true;
}
}.start();
while (!done)
;
} public static void main(String[] args) {
System.out.println("Finished");
}
}
为什么字段加了volatile修饰符,while(!done)还会死循环啊?
请指教
static volatile boolean done = false;
static {
new Thread() {
public void run() {
System.out.println("enter thread");
done = true;
}
}.start();
while (!done)
;
} public static void main(String[] args) {
System.out.println("Finished");
}
}
为什么字段加了volatile修饰符,while(!done)还会死循环啊?
请指教
对于表达式两边都有done的,好像就会有问题,比如:done = !done;
因为这种操作不是原子的
static volatile boolean done = false;
static {
new Thread() {
public void run() {
System.out.println("enter thread");
done = true; //如果线程还来不及执行,这里就不会被执行
}
}.start(); //这里线程不一定马上就能看是
while (!done) { //所以直接走到这里就死循环了
try{Thread.yield();} catch(Thrwable e){}; //加上试试看
} public static void main(String[] args) {
System.out.println("Finished");
}
} volatile变量是多线程处理时,一个线程改变了该变量的值,其他的线程能立刻感知该变量的值的变化
volatile变量主要是针对当时的8位16位机的非连续寻址而设计的,现在32位机很少用,能避免则尽量避免