首页 > 解决方案 > java中的类初始化和死锁

问题描述

当两个同时初始化这些时,以下代码会导致initialization相互依赖的类。deadlocksthreadsclasses

我无法找到此问题的根本原因。

class A {
    static boolean x = B.b;
    static boolean a = true;
}

class B {
    static boolean b = true;
    static {
        if (A.a)
            throw new Error();
    }
}

public class Test {
    public static void main(String[] args) {
        Thread t1 = new Thread() {
            public void run() {
                new A();
            }
        };
        Thread t2 = new Thread() {
            public void run() {
                new B();
            }
        };
        t1.start();
        t2.start();
    }
}

请帮助我了解这个死锁的根本原因以及如何修复它。

标签: javadeadlock

解决方案


当两个线程持有不同的锁并试图获取其他线程持有的锁时,就会发生死锁。

在这种情况下,它发生在

  • t1持有 的初始化锁class A,并尝试获取 的初始化锁class B

  • whilet2持有 的初始化锁class B,并尝试获取 的初始化锁class A


您可以通过按顺序执行来避免竞争t1条件t2

t1.start();
t1.join();

t2.start();
t2.join();

来自jls的更多详细信息:

对于每个类或接口 C,都有一个唯一的初始化锁 LC。

……

对于每个类或接口 C,都有一个唯一的初始化锁 LC。从 C 到 LC 的映射由 Java 虚拟机实现决定。初始化 C 的过程如下:

  1. 在 C 的初始化锁 LC 上同步。这包括等待当前线程可以获取 LC。

  2. ...


推荐阅读