我只是想在Java中的static
块中创建一个线程,导致发生死锁。代码段如下。
package deadlock;
final public class Main
{
static int value;
static
{
final Thread t = new Thread()
{
@Override
public void run()
{
value = 1;
}
};
t.start();
System.out.println("Deadlock detected");
try
{
t.join();
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
System.out.println("Released");
}
public static void main(String...args)
{
//Java stuff goes here.
}
}
它只是在控制台上显示检测到死锁并挂起。我想发生死锁的原因可能是在调用static
方法之前首先加载了main()
块。你能在上面的代码片段中看到死锁的确切原因吗?
答案 0 :(得分:5)
为了使线程能够设置静态值,必须加载该类。为了加载类,线程必须结束(以便静态块完成)。这可能就是你陷入僵局的原因。
答案 1 :(得分:1)
如果你发表评论
try
{
t.join();
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
不会发生死锁...你的线程将在类加载后运行。
答案 2 :(得分:0)
从技术上讲,你不要把它称为死锁。 “死锁”意味着存在某种类型的监视器争用。
您正在做的事与调用
具有相同的效果synchronized (Main.class) {
try {
Main.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
作为主要方法中的第一件事。您处于等待状态,您永远不会被唤醒。