1. 程式人生 > >Java面試題之在多線程情況下,單例模式中懶漢和餓漢會有什麽問題呢?

Java面試題之在多線程情況下,單例模式中懶漢和餓漢會有什麽問題呢?

餓漢模式 問題 之間 static 代碼 clas ava public 餓漢

懶漢模式和餓漢模式:

public class Demo {
    //private static Single single = new Single();//餓漢模式
    
    private static Single single2 = null;//餓漢模式
    
    public Demo() {
        if (single2 == null) {//1
            single2 = new Single();//2
        }
    }
}

在多線程環境下,代碼1和代碼2之間,這裏會有線程安全問題,線程A和線程B同時到代碼1和代碼2之間,兩個線程同時創建兩個對象,這不符合單例模式;

解決方案:

  可用雙重檢查鎖來實現

以下是雙重檢查鎖的代碼:

public class Demo {
    private static Single single2 = null;//餓漢模式

    public Demo() {
        if (single2 == null) {
            synchronized (Demo.class) {
                if (single2 == null) {
                    single2 = new Single();
                }
            }
        }
    }
}

Java面試題之在多線程情況下,單例模式中懶漢和餓漢會有什麽問題呢?