0

这是我的简单程序:

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 线程和 Test 类的 while 循环。循环检查 obj 是否为空,如果不是,我停止它并打印“2”。MyThread 为 obj 赋值。现在的问题是:

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

有人可以向我解释这种奇怪的行为吗?

谢谢!

4

2 回答 2

3

您的代码不是线程安全的。如果没有某种形式的同步,您在线程中所做的分配Test.obj不能保证在主线程中可见。

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

于 2012-05-18T08:24:33.647 回答
2

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

于 2012-05-18T08:26:44.370 回答