欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

設(shè)計(jì)模式--單例模式--第一天學(xué)習(xí)-創(chuàng)新互聯(lián)

單例模式

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信平臺(tái)小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了長(zhǎng)壽免費(fèi)建站歡迎大家使用!

單例模式的優(yōu)點(diǎn):

由于單例模式只生成一個(gè)實(shí)例,減少了系統(tǒng)性能開(kāi)銷(xiāo),當(dāng)一個(gè)對(duì)象產(chǎn)生需要比較多資源時(shí),如讀取配置,產(chǎn)生其他依賴(lài)對(duì)象時(shí),則可以通過(guò)啟動(dòng)時(shí)直接產(chǎn)生一個(gè)單例對(duì)象,然后永久的駐留在內(nèi)存的方式解決

單例模式的實(shí)現(xiàn):

有五中方式

1.       餓漢式

2.       懶漢式

3.       雙重檢測(cè)鎖實(shí)現(xiàn)

4.       靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)

5.       枚舉類(lèi)型實(shí)現(xiàn)

下邊對(duì)五中類(lèi)型做詳細(xì)筆記

餓漢式單例模式

餓漢式特點(diǎn):線程安全,調(diào)用效率高,但是不能延時(shí)加載

缺點(diǎn):如果只是加載類(lèi),而不調(diào)用類(lèi)中的方法,則會(huì)造成資源浪費(fèi)

餓漢式實(shí)現(xiàn):

1.       在定義類(lèi)中定義一個(gè)靜態(tài)變量,然后創(chuàng)建類(lèi)對(duì)象賦值給靜態(tài)變量,

2.       構(gòu)造器要私有化

3.       定義靜態(tài)方法返回靜態(tài)變量

代碼:

public class SingletonDemo1 {
//類(lèi)初始化時(shí),立即加載這個(gè)對(duì)象(沒(méi)有延時(shí)加載的優(yōu)勢(shì))。加載類(lèi)時(shí),天然的是線程安全的!
private static SingletonDemo1 instance = new SingletonDemo1(); 
private SingletonDemo1(){
}
//方法沒(méi)有同步,調(diào)用效率高!
public static SingletonDemo1  getInstance(){
           return instance;
}
}

懶漢式單例模式

懶漢式特點(diǎn):線程安全,調(diào)用效率不高,但是可以延時(shí)加載

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

懶漢式實(shí)現(xiàn):

1.       在定義的類(lèi)中定義一個(gè)私有的靜態(tài)變量,不用賦值

2.       構(gòu)造方法私有化

3.       對(duì)getInstance()方法加鎖synchronized,方法中只創(chuàng)建一次對(duì)象,對(duì)靜態(tài)變量賦一次值

代碼:

public class SingletonDemo2 {
//類(lèi)初始化時(shí),不初始化這個(gè)對(duì)象(延時(shí)加載,真正用的時(shí)候再創(chuàng)建)。
private static SingletonDemo2 instance; 
private SingletonDemo2(){ //私有化構(gòu)造器
}
//方法同步,調(diào)用效率低!
public static  synchronized SingletonDemo2  getInstance(){
           if(instance==null){
                    instance = new SingletonDemo2();
           }
           return instance;
}
}

雙重檢測(cè)鎖實(shí)現(xiàn)單例

雙重檢測(cè)鎖特點(diǎn):實(shí)現(xiàn)了懶加載和調(diào)用效率高的特點(diǎn)

缺點(diǎn):由于編譯器優(yōu)化原因和jvm底層內(nèi)部模型原因,偶爾會(huì)出現(xiàn)問(wèn)題,不建議使用

雙重檢測(cè)鎖實(shí)現(xiàn):

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() { 
 
  } 
}

靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)單例

靜態(tài)內(nèi)部類(lèi)特點(diǎn):線程安全,調(diào)用效率高,懶加載

靜態(tài)內(nèi)部類(lèi)單例實(shí)現(xiàn):

1.       定義的類(lèi)中定義一個(gè)靜態(tài)內(nèi)部類(lèi),靜態(tài)內(nèi)部類(lèi)中定義一個(gè)靜態(tài)常量,創(chuàng)建對(duì)象賦值給靜態(tài)常量

2.       構(gòu)造方法私有化

3.       定義getInstance()方法返回靜態(tài)內(nèi)部類(lèi)中定義的靜態(tài)常量

代碼:

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

枚舉實(shí)現(xiàn)單例

枚舉實(shí)現(xiàn)特點(diǎn):線程安全,沒(méi)有懶加載,調(diào)用效率高,實(shí)現(xiàn)簡(jiǎn)單,枚舉本身就是單例模式,由JVM從根本上提供保障,避免通過(guò)反射和反序列化的漏洞

缺點(diǎn):無(wú)延遲加載

枚舉實(shí)現(xiàn)單例:

  1. 定義枚舉類(lèi)

  2. 在枚舉類(lèi)中定義一個(gè)元素

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

代碼:

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

單例模式總結(jié)

主要:

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

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

其他

雙重檢測(cè)鎖式(由于jvm底層內(nèi)部模型原型,偶爾會(huì)出現(xiàn)問(wèn)題,不建議使用)

靜態(tài)內(nèi)部類(lèi)(線程安全,調(diào)用效率高,可以延時(shí)加載)

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

如何選用?

單例對(duì)象 占用資源少,不需要延時(shí)加載

枚舉好于餓漢式

單例對(duì)象 占用資源大,需要延時(shí)加載

靜態(tài)內(nèi)部類(lèi)好于懶漢式

當(dāng)前名稱(chēng):設(shè)計(jì)模式--單例模式--第一天學(xué)習(xí)-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://www.chinadenli.net/article48/diophp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司虛擬主機(jī)網(wǎng)站內(nèi)鏈外貿(mào)網(wǎng)站建設(shè)網(wǎng)站建設(shè)電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)