1. 程式人生 > >懶漢式和餓漢式

懶漢式和餓漢式

餓漢式
public class LazySingle {
    //因為不想被建立物件,所以必須構造方法私有化,如果不寫也會有預設的構造方法,所以必須寫私有的
    private LazySingle() {
    }

    //延時建立
    private static LazySingle ls = null;

    //加鎖是為了保證執行緒的安全防止建立多個物件
    public static LazySingle getLazySingle() {
        if (ls == null) {
            ls = new LazySingle();
        }
        return ls;
    }
}

懶漢式

方式一:不加鎖的,所以執行緒不安全

public class HungrySingle {
    private static final HungrySingle hs = new HungrySingle();
    //因為不想被建立物件,所以必須構造方法私有化,如果不寫也會有預設的構造方法,所以必須寫私有的
    private HungrySingle(){}
    public static HungrySingle getHs() {
        return hs;
    }
}

方式二:加鎖,保證執行緒安全

public class LazySingle {
    //因為不想被建立物件,所以必須構造方法私有化,如果不寫也會有預設的構造方法,所以必須寫私有的
    private LazySingle() {
    }
    //延時建立
    private static LazySingle ls = null;
    //加鎖是為了保證執行緒的安全防止建立多個物件
     public static LazySingle getLazySingle() {
        if (ls == null) {
            synchronized (LazySingle.class) {
                if (ls == null) {
                    ls = new LazySingle();
                }
            }
        }
        return ls;
    }
}
方法二中,我們能夠看出鎖也可以加在public static LazySingle getLazySingle() {}中,但是如果加在方法中那麼每次呼叫都會判斷鎖的歸屬權,尤其在迴圈中,很影響效率,所以要加在第二個if外面。