它僵局了吗?为什么会这样?

时间:2014-04-30 23:27:50

标签: java multithreading concurrency static-initialization

有人可以向我解释为什么以下代码什么都不打印? 当我尝试调试它时,调试器冻结在t.join();行上。但是在调试器中我看到了消息:“程序正在运行”。

public class Main_problem1_multithreading {
    private static boolean initialized = false;

    static {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                initialized = true;
            }
        });
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            throw new AssertionError(e);
        }
    }

    public static void main(String[] args) {
        System.out.println(initialized);
    }
}

1 个答案:

答案 0 :(得分:1)

当JVM第一次加载类时,会发生静态初始化。加载类的线程对Static Initializer有一个锁,在这种情况下,主线程已经持有锁。 在释放该锁之前,新生成的线程无法访问"初始化"变量。

您可以在我附上的图像中清楚地看到。线程 - 0在第10行踩。第10行是新线程尝试更新初始化变量的地方。所以这个新线程一直在等待它永远不会得到的锁,主线程一直在等待新线程加入它。僵局!!希望它有所帮助!

package com.test;

public class Test {
    private static boolean initialized = false;

    static {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                initialized = true;
                System.out.println("New Thread" + initialized);
            }
        });
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println("Main Thread" + initialized);
    }
}

enter image description here