懶漢式和餓漢式
阿新 • • 發佈:2019-02-09
餓漢式
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 static LazySingle getLazySingle() {}中,但是如果加在方法中那麼每次呼叫都會判斷鎖的歸屬權,尤其在迴圈中,很影響效率,所以要加在第二個if外面。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; } }