在Java中的静态块中创建线程时导致死锁
我只是试图在Java中的在Java中的静态块中创建线程时导致死锁,java,multithreading,deadlock,Java,Multithreading,Deadlock,我只是试图在Java中的静态块中创建一个导致死锁发生的线程。代码片段如下所示 package deadlock; final public class Main { static int value; static { final Thread t = new Thread() { @Override public void run() {
静态
块中创建一个导致死锁发生的线程。代码片段如下所示
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.
}
}
它只显示控制台上检测到的死锁并挂起。我猜死锁发生的原因可能是在调用
main()
方法之前先加载static
块。您能在上面的代码片段中看到死锁的确切原因吗?为了让线程能够设置静态值,必须加载类。为了加载类,线程必须结束(以便静态块完成)。这可能就是死锁的原因。为了让线程能够设置静态值,必须加载类。为了加载类,线程必须结束(以便静态块完成)。这可能就是你陷入僵局的原因。如果你不加评论的话
try
{
t.join();
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
死锁不会发生…您的线程将在类加载后运行。如果您注释掉
try
{
t.join();
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
死锁不会发生…您的线程将在类加载后运行。从技术上讲,您不会将其称为死锁。“死锁”意味着存在某种类型的监视器争用 你所做的和打电话的效果一样
synchronized (Main.class) {
try {
Main.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
作为主要方法的第一件事。您处于等待状态,从未被唤醒。从技术上讲,这并不是死锁。“死锁”意味着存在某种类型的监视器争用 你所做的和打电话的效果一样
synchronized (Main.class) {
try {
Main.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
作为主要方法的第一件事。您处于等待状态,从中您永远不会被唤醒。是的,
static
块在main()
之前执行。static
块在main()
之前执行。