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)还会死循环啊?
请指教

解决方案 »

  1.   

    volatile最好别用,容易错
    对于表达式两边都有done的,好像就会有问题,比如:done = !done;
    因为这种操作不是原子的
      

  2.   

    public class Init { 
    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位机很少用,能避免则尽量避免