单例模式---死锁

在重温单例模式时候,发现一个比较好玩的东西,死锁。
首先,有两个单例bean,相互需要。

public class Sigton1 {

    private Sigton2 sigton2;

    private static Sigton1 sigton1 = null;

    private Sigton1(Sigton2 sigton2) {
        this.sigton2 = sigton2;
    }

    public static Sigton1 getInstance(){
        if (null == sigton1) {
            synchronized (Sigton1.class) {
                Sigton2 instance = Sigton2.getInstance();
                sigton1 = new Sigton1(instance);
            }
        }
        return sigton1;
    }
}
public class Sigton2 {

    private Sigton1 sigton1;
    private static Sigton2 sigton2;

    private Sigton2(Sigton1 sigton1) {
        this.sigton1 = sigton1;
    }

    public static Sigton2 getInstance(){
        if (null == sigton2) {
            synchronized (Sigton2.class) {
                Sigton1 instance = Sigton1.getInstance();
                sigton2 = new Sigton2(instance);
            }
        }
        return sigton2;
    }
}

在写一个测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class LearningApplicationTests {

    @Resource
    Executor asyncServerExecutor;

    @Test
    public void contextLoads() {
        System.out.println("start");
        asyncServerExecutor.execute(() -> {
            Sigton1 instance = Sigton1.getInstance();
            System.out.println(instance);
        });
        Sigton2 instance = Sigton2.getInstance();
        System.out.println(instance);
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43189126/article/details/89161272