欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java單例五種實(shí)現(xiàn)模式解析

 更新時間:2019年09月07日 09:43:20   作者:技術(shù)-劉騰飛  
這篇文章主要介紹了java單例五種實(shí)現(xiàn)模式解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

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

一上來就把單例對象創(chuàng)建出來了,要用的時候直接返回即可,這種可以說是單例模式中最簡單的一種實(shí)現(xiàn)方式。但是問題也比較明顯。單例在還沒有使用到的時候,初始化就已經(jīng)完成了。也就是說,如果程序從頭到位都沒用使用這個單例的話,單例的對象還是會創(chuàng)建。這就造成了不必要的資源浪費(fèi)。所以不推薦這種實(shí)現(xiàn)方式。

public class ImageLoader{ 
   private static ImageLoader instance = new ImageLoader; 
   private ImageLoader(){} 
   public static ImageLoader getInstance(){ 
     return instance; 
   } 
}

懶漢式(線程安全,調(diào)用效率不高,但是能延時加載)

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

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

可以看到使用這種方式我們沒有顯式的進(jìn)行任何同步操作,那他是如何保證線程安全呢?和餓漢模式一樣,是靠JVM保證類的靜態(tài)成員只能被加載一次的特點(diǎn),這樣就從JVM層面保證了只會有一個實(shí)例對象。

那么問題來了,這種方式和餓漢模式又有什么區(qū)別呢?不也是立即加載么?實(shí)則不然,加載一個類時,其內(nèi)部類不會同時被加載。一個類被加載,當(dāng)且僅當(dāng)其某個靜態(tài)成員(靜態(tài)域、構(gòu)造器、靜態(tài)方法等)被調(diào)用時發(fā)生。

但是在遇到序列化對象時,默認(rèn)的方式運(yùn)行得到的結(jié)果就是多例的。這種情況不多做說明了,使用時請注意。

 public class SingletonDemo3 {   
   private static class SingletonClassInstance{
     private static final SingletonDemo3 instance=new SingletonDemo3();
   }   
   private SingletonDemo3(){}   
   public static SingletonDemo3 getInstance(){
     return SingletonClassInstance.instance;
   }   
 }

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

 public enum SingletonDemo4 {   
   //枚舉元素本身就是單例
   INSTANCE;   
   //添加自己需要的操作
   public void singletonOperation(){   
   }
 }

Double CheckLock實(shí)現(xiàn)單例:DCL也就是雙重鎖判斷機(jī)制(由于JVM底層模型原因,偶爾會出問題,不建議使用)

選用

單例對象 占用資源少,不需要延時加載,枚舉 好于 餓漢

單例對象 占用資源多,需要延時加載,靜態(tài)內(nèi)部類 好于 懶漢式

注意線程安全問題

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java多線程實(shí)現(xiàn)多人聊天室功能

    Java多線程實(shí)現(xiàn)多人聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Java多線程實(shí)現(xiàn)多人聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • java實(shí)現(xiàn)簡易連連看小游戲

    java實(shí)現(xiàn)簡易連連看小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡易連連看小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java語言實(shí)現(xiàn)簡單FTP軟件 FTP軟件效果圖預(yù)覽之上傳功能(3)

    Java語言實(shí)現(xiàn)簡單FTP軟件 FTP軟件效果圖預(yù)覽之上傳功能(3)

    這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡單FTP軟件,F(xiàn)TP軟件效果圖預(yù)覽之上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java躲不過設(shè)計(jì)模式的坑之代理模式詳解

    Java躲不過設(shè)計(jì)模式的坑之代理模式詳解

    設(shè)計(jì)模式看來更像是一種設(shè)計(jì)思維或設(shè)計(jì)思想,為你的項(xiàng)目工程提供方向,讓你的項(xiàng)目工程更加健壯、靈活,延續(xù)生命力。本文即將分享的是設(shè)計(jì)模式的其中一種:代理模式,感興趣的可以了解一下
    2022-09-09
  • java微信server錄音下載到自己server

    java微信server錄音下載到自己server

    這篇文章主要為大家詳細(xì)介紹了java微信server錄音下載到自己server的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 詳解idea maven nexus 常見命令配置

    詳解idea maven nexus 常見命令配置

    這篇文章主要介紹了idea maven nexus 常見命令配置的相關(guān)知識,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 如何解決java:錯誤:無效的源發(fā)行版:16

    如何解決java:錯誤:無效的源發(fā)行版:16

    這篇文章主要介紹了如何解決java:錯誤: 無效的源發(fā)行版:16問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java判斷字節(jié)流是否是 UTF8編碼方法示例

    Java判斷字節(jié)流是否是 UTF8編碼方法示例

    這篇文章主要我大家介紹了Java判斷字節(jié)流是否是 UTF8編碼方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java SpringBoot使用guava過濾器

    Java SpringBoot使用guava過濾器

    這篇文章主要介紹了Java SpringBoot使用guava過濾器,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析

    Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析

    這篇文章主要介紹了Jmeter結(jié)構(gòu)體系及運(yùn)行原理順序解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論