【发布时间】:2019-06-15 15:09:18
【问题描述】:
我从那个答案中获取代码-https://stackoverflow.com/a/9286697/2674303
为什么我创建了我不明白为什么该代码会导致死锁的当前主题:
public class Lock implements Runnable {
static {
System.out.println(Thread.currentThread().getId() + "# Getting ready to greet the world");
try {
System.out.println(Thread.currentThread().getId() + "# before lock creation");
Lock target = new Lock();
System.out.println(Thread.currentThread().getId() + "# after lock creation");
Thread t = new Thread(target);
t.start();
System.out.println(Thread.currentThread().getId() + "# awaiting thread finish");
t.join();
System.out.println(Thread.currentThread().getId() + "# static block finished");
} catch (InterruptedException ex) {
System.out.println("won't see me");
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread() + "Hello World! ");
}
public void run() {
System.out.println(Thread.currentThread().getId() + "# Started thread");
Thread t = new Thread(new Lock());
t.start();
}
}
我尝试启动它很多时间,它总是导致死锁。
输出总是一样的:
1# Getting ready to greet the world
1# before lock creation
1# after lock creation
1# awaiting thread finish
13# Started thread
我试图使初始化程序成为非静态的,并且在它之后代码变得不会导致死锁。所以我相信它在某种程度上与静态类初始化有关。
你能解释一下吗?
回答
感谢 John Skeet 的回答,但为了简化我删除了阻止我理解该示例的代码行:
public class Lock implements Runnable {
static {
try {
Thread thread = new Thread(new Lock());
thread.start();
thread.join();
} catch (InterruptedException ex) {
System.out.println("won't see me");
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread() + "Hello World! ");
}
public void run() {
new Lock();
}
}
也会导致死锁
【问题讨论】:
-
@Turing85: 不,
new Lock()是run方法和静态初始化器 - 不在构造函数中。那里没有递归。 (如果不是死锁,它会因为线程太多而耗尽内存,但它不会是堆栈溢出。) -
@JonSkeet Oh there is a recursion (although it throws an
OutOfMemoryException)。如果run()被执行(如果线程被启动),那么一个新的Lock-object 被创建,它 - 再次 - 在一个单独的线程中启动。 -
你不应该在静态初始化器中做这样的事情。它们本质上被特别锁定并在意外情况下运行。此外,它使测试、错误处理和调试变得非常困难。
-
@eckes 这是显而易见的事实
-
并且运行一个单独的线程并等待其终止与直接运行它是等效的(对于大多数目的)
new Lock().run();
标签: java multithreading concurrency deadlock static-initialization