單例模式,顧名思義就是只有一個實體,并且它自己負責創建自己的物件,這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要實體化該類的物件,
核心代碼:構造方法私有化,private,提供一個靜態的公開對外獲取實體的方法
1.懶漢式
public class MyStringUtil {
private static MyStringUtil myStringUtil;
//私有化構造器
private MyStringUtil(){
}
//提供一個靜態的公開對外訪問的方法
public static MyStringUtil getInstance(){
if (myStringUtil == null){
myStringUtil = new MyStringUtil();
}
return myStringUtil;
}
}
懶漢式,就是實體在用到的時候才去創建,比較懶,直到用到的時候才去檢查有沒有創建,有執行緒安全問題,如果剛開始有多個執行緒同時呼叫則會被創建多次,可以加上synchronized,所有又分成了執行緒安全和執行緒不安全兩種寫法
2.餓漢式
public class MyStringUtil {
private static MyStringUtil myStringUtil = new MyStringUtil();
//私有化構造器
private MyStringUtil(){
}
//提供一個靜態的公開對外訪問的方法
public static MyStringUtil getInstance(){
return myStringUtil;
}
}
餓漢式,就是不管有沒有用到,啟動的時候先創建實體,比較勤奮,壞處就是浪費記憶體空間,好處就是沒有執行緒安全問題
3.雙檢鎖
public class MyStringUtil {
private static volatile MyStringUtil myStringUtil;
//私有化構造器
private MyStringUtil(){
}
//提供一個靜態的公開對外訪問的方法
public static MyStringUtil getInstance(){
if (myStringUtil == null){
synchronized (MyStringUtil.class){
if (myStringUtil == null){ //再次檢查有沒有創建
myStringUtil = new MyStringUtil();
}
}
}
return myStringUtil;
}
}
雙檢鎖結合了懶漢式和餓漢式,在創建的時候保證執行緒安全,這樣又保證了執行緒安全,比直接上鎖提高了效率,又節省了空間
4.靜態內部類
public class MyStringUtil {
//私有化構造器
private MyStringUtil(){
}
//沒有系結關系,而且只有被呼叫到時才會裝載,從而實作了延遲加載,
private static class SingletonMyStringUtil{
//靜態初始化器,由JVM來保證執行緒安全
private static MyStringUtil myStringUtil = new MyStringUtil();
}
//提供一個靜態的公開對外訪問的方法
public static MyStringUtil getInstance(){
return SingletonMyStringUtil.myStringUtil;
}
}
靜態內部類,靜態初始化器,由JVM來保證執行緒安全 ,只有被呼叫到時才會裝載,從而實作了延遲加載,
5.列舉
public enum UtilEnm {
StringUtil;
public boolean check(String o) {
return o != null&& "".equals(o);
}
}
列舉自動支持序列化機制,絕對防止多次實體化,
在實際的應用場景中一般用到的懶漢式和雙檢鎖比較多
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238498.html
標籤:其他
上一篇:8.0.22Mysql的詳細安裝
下一篇:肖四背背背
