在Java 7 64位中,我的程序在循环中冻结

时间:2012-05-18 08:21:21

标签: java

这是我的简单程序:

public class Test {
    public static Object obj = null;

    public static void main(String[] args) {
        obj = null;
        System.out.println("Start");
        MyThread myThread = new MyThread();
        myThread.start();
        while(obj == null) {
            //System.out.println("");
        }
        System.out.println("Stop");

    }
}

class MyThread extends Thread {

    @Override
    public void run() {
        System.out.println("Thread 1");
        try {
            sleep(1);
        } catch (InterruptedException ex) {
        }
        System.out.println("Thread 2");
        Test.obj = new Object();
        System.out.println("Thread 3");
    } 
}

正如您所看到的,我运行MyThread线程和while类循环。循环检查obj是否为null,如果不是,我将其停止并打印“2”。 MyThread为obj分配一个值。现在问题是:

在Java 7 64位下,如果是空的while循环,它永远不会停止。但是,如果我取消注释System.out.print(“”),则会打印循环下的“停止”。但是对于循环内的其他语句(例如int i = 1;),我的程序会冻结。在Java 32位下,一切都适用于所有情况。

有人能解释我这种奇怪的行为吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

您的代码不是线程安全的。如果没有某种形式的同步,则不保证在主线程中对Test.obj进行的赋值是可见的。

将该静态变量设为私有,并提供 synchronized 静态getter / tester / setter方法将是正确实现此方法的一种方法(只要所有访问都通过这些方法)。存在其他替代方案。

答案 1 :(得分:2)

请记住,Java中也有volatile个关键字。 在这个特定示例的情况下 - Java缓存您的obj