亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

設計模式--單例模式--第一天學習

發布時間:2020-04-15 11:38:06 來源:網絡 閱讀:340 作者:每天成長 欄目:軟件技術

單例模式

單例模式的優點:

由于單例模式只生成一個實例,減少了系統性能開銷,當一個對象產生需要比較多資源時,如讀取配置,產生其他依賴對象時,則可以通過啟動時直接產生一個單例對象,然后永久的駐留在內存的方式解決

 

單例模式的實現:

有五中方式

1.       餓漢式

2.       懶漢式

3.       雙重檢測鎖實現

4.       靜態內部類實現

5.       枚舉類型實現

下邊對五中類型做詳細筆記

餓漢式單例模式

 

 

餓漢式特點:線程安全,調用效率高,但是不能延時加載

缺點:如果只是加載類,而不調用類中的方法,則會造成資源浪費

餓漢式實現:

1.       在定義類中定義一個靜態變量,然后創建類對象賦值給靜態變量,

2.       構造器要私有化

3.       定義靜態方法返回靜態變量

代碼:

public class SingletonDemo1 {
//類初始化時,立即加載這個對象(沒有延時加載的優勢)。加載類時,天然的是線程安全的!
private static SingletonDemo1 instance = new SingletonDemo1(); 
private SingletonDemo1(){
}
//方法沒有同步,調用效率高!
public static SingletonDemo1  getInstance(){
           return instance;
}
}

 

懶漢式單例模式

懶漢式特點:線程安全,調用效率不高,但是可以延時加載

缺點:資源利用率高了,但是每次調用getInstance()方法都要同步,并發效率低

懶漢式實現:

1.       在定義的類中定義一個私有的靜態變量,不用賦值

2.       構造方法私有化

3.       getInstance()方法加鎖synchronized,方法中只創建一次對象,對靜態變量賦一次值

代碼:

public class SingletonDemo2 {
//類初始化時,不初始化這個對象(延時加載,真正用的時候再創建)。
private static SingletonDemo2 instance; 
private SingletonDemo2(){ //私有化構造器
}
//方法同步,調用效率低!
public static  synchronized SingletonDemo2  getInstance(){
           if(instance==null){
                    instance = new SingletonDemo2();
           }
           return instance;
}
}

 

雙重檢測鎖實現單例

雙重檢測鎖特點:實現了懶加載和調用效率高的特點

缺點:由于編譯器優化原因和jvm底層內部模型原因,偶爾會出現問題,不建議使用

雙重檢測鎖實現:

public class SingletonDemo3 { 
 
  private static SingletonDemo3 instance = null; 
 
  public static SingletonDemo3 getInstance() { 
    if (instance == null) { 
      SingletonDemo3 sc; 
      synchronized (SingletonDemo3.class) { 
        sc = instance; 
        if (sc == null) { 
          synchronized (SingletonDemo3.class) { 
            if(sc == null) { 
              sc = new SingletonDemo3(); 
            } 
          } 
          instance = sc; 
        } 
      } 
    } 
    return instance; 
  } 
 
  private SingletonDemo3() { 
 
  } 
}


 

靜態內部類實現單例

靜態內部類特點:線程安全,調用效率高,懶加載

靜態內部類單例實現:

1.       定義的類中定義一個靜態內部類,靜態內部類中定義一個靜態常量,創建對象賦值給靜態常量

2.       構造方法私有化

3.       定義getInstance()方法返回靜態內部類中定義的靜態常量

 

代碼:

public class Singleto
nDemo4 {
private static class SingletonClassInstance {
           private static final SingletonDemo4 instance = new SingletonDemo4();
}
private SingletonDemo4(){
}
//方法沒有同步,調用效率高!
public static SingletonDemo4  getInstance(){
           return SingletonClassInstance.instance;
}
}

 

枚舉實現單例

枚舉實現特點:線程安全,沒有懶加載,調用效率高,實現簡單,枚舉本身就是單例模式,由JVM從根本上提供保障,避免通過反射和反序列化的漏洞

缺點:無延遲加載

枚舉實現單例:

  1. 定義枚舉類

  2. 在枚舉類中定義一個元素

  3. 定義返回枚舉中定義的元素

代碼:

public enum SingletonDemo5 {
  
   //這個枚舉元素,本身就是單例對象!
   INSTANCE;
  
   //添加自己需要的操作!
   public void singletonOperation(){
            System.out.println("枚舉實現單例模式");
   }
}

單例模式總結

主要:

餓漢式(線程安全,調用效率高,不能延時加載)

懶漢式(線程安全,調用效率不高,可以延時加載)

其他

雙重檢測鎖式(由于jvm底層內部模型原型,偶爾會出現問題,不建議使用)

靜態內部類(線程安全,調用效率高,可以延時加載)

枚舉式(線程安全,調用效率高,不能延時加載,并且可以天然的防止反射和反序列化漏洞)

如何選用?

單例對象 占用資源少,不需要延時加載

枚舉好于餓漢式

單例對象 占用資源大,需要延時加載

靜態內部類好于懶漢式



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金阳县| 新绛县| 河东区| 醴陵市| 张家界市| 内江市| 买车| 广南县| 扶余县| 邵阳县| 孟村| 海安县| 龙里县| 金华市| 霍林郭勒市| 娄烦县| 孝昌县| 六盘水市| 天气| 南京市| 宁陵县| 贺州市| 越西县| 和田市| 铁岭市| 高碑店市| 浮山县| 镇宁| 江北区| 崇仁县| 乌拉特前旗| 铁力市| 陆川县| 金华市| 马关县| 金坛市| 连南| 萍乡市| 鄯善县| 上高县| 镇雄县|