【发布时间】:2017-12-11 11:52:23
【问题描述】:
假设我们有以下类和两个线程 t1,t2。
public class A {
static String str = "abc";
static {
B.bMeth();
}
static void aMeth() {
System.out.println("A::meth()");
str = "abc2";
}
static void aSomeMeth() {}
}
public class B {
static {
A.aMeth();
}
static void bMmeth() {}
static void bSomeMeth() {}
}
以下是发生死锁的顺序:
1) t1 执行 A.aSomeMeth() 获取 A 的类加载锁。
2) t2 执行 B.bSomeMeth() 获取 B 的类加载锁。
3) t1 继续执行 B.bMeth() 并在持有 A 的锁的同时要求 B 的锁。
4) t2 继续执行 A.aMeth() 并要求 A 锁定,同时持有 B 锁定。
这会导致死锁。但在我的情况下,t2 实际上进入了aMeth() 并在访问静态成员str 时被阻止。所以我想知道在特殊情况下,线程是否可以在初始化之前进入静态方法。
在我的测试运行中,t2 总是按预期在 A.aMeth() 处被阻止,所以是否有任何极端情况可以进入它并在 str 上被阻止,JIT 优化,如方法内联等。
【问题讨论】:
标签: java multithreading deadlock static-initializer