シングル・モード---デッドロック

1529 ワード

単例モードを再温めると、面白いものが見つかり、デッドロックになります.まず,2つの単例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);
    }

}