有人可以向我解释为什么以下代码什么都不打印?
当我尝试调试它时,调试器冻结在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);
}
}
答案 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);
}
}