最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 單例的五種實現方式及其性能分析

 更新時間:2017年07月04日 08:55:43   作者:-SOLO-  
這篇文章主要介紹了java 單例的五種實現方式及其性能分析。的相關資料,需要的朋友可以參考下

java 單例的五種實現方式及其性能分析

序言

在23種設計模式中,單例是最簡單的設計模式,但是也是很常用的設計模式。從單例的五種實現方式中我們可以看到程序員對性能的不懈追求。下面我將分析單例的五種實現方式的優(yōu)缺點,并對其在多線程環(huán)境下的性能進行測試。

實現

單例模式適用于資源占用較多的類,保證一個類只有一個實例即單例。通用的做法就是構造器私有化,提供一個全局的訪問點,返回類的實例。

uml圖:

1.餓漢式

代碼實現:

package com.zgh.gof23.singleton;
/**
 * 餓漢式
 * @author yuelin
 *
 */
public class SingleDemo {
 private static SingleDemo instance = new SingleDemo();
 //私有化構造器
 private SingleDemo() {
 //防止其他通過反射調用構造方法,破解單例
 if (instance != null) {
  throw new RuntimeException();
 }
 }

 //對外提供統一的訪問點
 public static SingleDemo getInstance() {
 return instance;
 }
}

優(yōu)點

1.實例的初始化由JVM裝載類的時候進行,保證了線程的安全性
2.實現簡單方便
3.實例的訪問效率高

缺點

1.不能實現懶加載,如果不調用getInstance(),那么這個類就白白的占據內存,資源的利用率不高
注意

1.防止通過反射調用構造方法破解單例模式。
2.防止通過反序列產生新的對象。

2.懶漢式

代碼實現:

package com.zgh.gof23.singleton;

/**
 * 懶漢式實現單例
 * 
 * @author zhuguohui
 *
 */
public class SingleDemo2 {
 // 此處并不初始化實例
 private static SingleDemo2 instance;

 private SingleDemo2() {
 if (instance != null) {
  throw new RuntimeException();
 }
 }

 /**
 * 當調用此方法的時候才初始化實例, 為了實現線程安全,需要使用同步方法
 * 
 * @return
 */
 public static synchronized SingleDemo2 getInstance() {
 if (instance == null) {
  instance = new SingleDemo2();
 }
 return instance;
 }
}

優(yōu)點

1.只有使用這個類的時候才初始化實例,優(yōu)化了資源利用率

缺點

1.為了實現線程安全,使用了同步方法獲取,增加了訪問的開銷

注意

1.防止通過反射調用構造方法破解單例模式。
2.防止通過反序列產生新的對象。

3.雙重檢查

代碼實現:

package com.zgh.gof23.singleton;

/**
 * 雙重檢查
 * 
 * @author zhuguohui
 *
 */
public class SingleDemo3 {
 private static SingleDemo3 instance;

 private SingleDemo3() {
 if (instance != null) {
  throw new RuntimeException();
 }
 }

 public static SingleDemo3 getInstance() {
 //第一重檢查,提高效率
 if (instance == null) {
  synchronized (SingleDemo3.class) {
  //第二重檢查保證線程安全
  if (instance == null) {
   instance = new SingleDemo3();
  }
  }
 }
 return instance;
 }
}

優(yōu)點

1.實現懶加載
2.通過縮小同步區(qū)域和第一次檢查提高訪問效率

缺點

1.為了實現線程安全,使用了同步方法獲取,增加了訪問的開銷

注意

1.防止通過反射調用構造方法破解單例模式。
2.防止通過反序列產生新的對象。

4.靜態(tài)內部類

代碼實現:

/**
 * 靜態(tài)內部類實現單例
 * 
 * @author zhuguohui
 *
 */
public class SingleDemo4 {
 private static SingleDemo4 instance;

 private static class SingleDemo4Holder {
 private static final SingleDemo4 instance = new SingleDemo4();
 }

 private SingleDemo4() {
 if (instance != null) {
  throw new RuntimeException();
 }
 }

 /**
 * 調用這個方法的時候,JVM才加載靜態(tài)內部類,才初始化靜態(tài)內部類的類變量。由于由JVM初始化,保證了線程安全性,
 * 同時又實現了懶加載
 * @return
 */
 public static SingleDemo4 getInstance() {
 return SingleDemo4Holder.instance;
 }
}

優(yōu)點

1.即實現了線程安全,又實現了懶加載

缺點

2.實現稍顯復雜

5.枚舉實現

代碼實現:

/**
 * 枚舉實現單例
 * 枚舉由JVM實現其的單例性
 * @author zhuguohui
 *
 */
public enum SingleDemo5 {
 INSTANCE;
}

優(yōu)點

1.實現簡單
2.線程安全
3.天熱對反射和反序列化漏洞免疫(由JVM提供)

缺點

2.不能實現懶加載

注意

1.防止通過反射調用構造方法破解單例模式。
2.防止通過反序列產生新的對象。

測試

源碼

public class APP {
 public static void main(String[] args) {

 int threadCount = 100;
 long start = System.currentTimeMillis();
 final CountLock lock = new CountLock(threadCount);
 for (int i = 0; i < threadCount; i++) {
  new Thread(new Runnable() {

  @Override
  public void run() {
   for (int j = 0; j < 10000000; j++) {
   //通過更換此處,來測試不同單例實現方式在多線程環(huán)境下的性能
   SingleDemo5 demo = SingleDemo5.INSTANCE;
   }
   lock.finish();
  }
  }).start();

 }
 //等待所有線程執(zhí)行完
 lock.waitForWrok();
 long end = System.currentTimeMillis();
 System.out.println("總共耗時" + (end - start));
 }
}

為了統計所以線程執(zhí)行完需要的時間,我寫了一個工具類

package com.zgh.gof23.singleton;

public class CountLock {
 //線程的總數量
 private int count;

 public CountLock(int count) {
 this.count = count;
 }

 /**
 * 當一個線程完成任務以后,調用一次這個方法
 */
 public synchronized void finish() {
 count--;
 if (count == 0) {
  notifyAll();
 }
 }

 /**
 * 需要等待其他線程執(zhí)行完的線程,調用此方法。
 */
 public synchronized void waitForWrok() {
 while (count > 0) {
  try {
  wait();
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }
 }
}

結果

五種單例實現方式,在100個線程下,每個線程訪問1千萬次實例的用時.

Tables 實現方式 用時(毫秒)
1 餓漢式 13
2 懶漢式 10778
3 雙重檢查 15
4 靜態(tài)內部類 14
5 枚舉 12

(*注意:由于不同電腦之間的性能差異,測試的結果可能不同)

總結

如果需要懶加載就使用靜態(tài)內部類方式,如果不需要就使用枚舉方式。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持! 

相關文章

  • IntelliJ?IDEA如何集成maven

    IntelliJ?IDEA如何集成maven

    這篇文章主要介紹了IntelliJ?IDEA如何集成maven問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot中封裝Cors自動配置方式

    SpringBoot中封裝Cors自動配置方式

    這篇文章主要介紹了SpringBoot中封裝Cors自動配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 深入淺析Mybatis的缺陷問題

    深入淺析Mybatis的缺陷問題

    Mybatis是業(yè)界非常流行的持久層框架,輕量級、易用,在金融IT領域完全是領軍地位,比Hibernate更受歡迎,優(yōu)勢非常多,也是非常值得我們學習的。這篇文章主要介紹了Mybatis的缺陷問題的相關資料,需要的朋友可以參考下
    2016-10-10
  • Spring Boot Test詳解

    Spring Boot Test詳解

    Spring Test與JUnit等其他測試框架結合起來,提供了便捷高效的測試手段,而Spring Boot Test 是在Spring Test之上的再次封裝,增加了切片測試,增強了mock能力,這篇文章主要介紹了Spring Boot Test介紹,需要的朋友可以參考下
    2024-02-02
  • SpringSecurity?認證實現流程分析

    SpringSecurity?認證實現流程分析

    SpringSecurity框架通過一個過濾器鏈來處理認證和授權,主要包括UsernamePasswordAuthenticationFilter負責處理登錄請求,本文給大家介紹SpringSecurity?認證實現登錄校驗,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • Java設計模式之中介者模式(Mediator Pattern)簡介

    Java設計模式之中介者模式(Mediator Pattern)簡介

    這篇文章主要介紹了Java設計模式之中介者模式(Mediator Pattern),需要的朋友可以參考下
    2014-07-07
  • javafx實現圖片3D翻轉效果方法實例

    javafx實現圖片3D翻轉效果方法實例

    程序實現思路: 在javafx中Node對象有一個effect屬性,可以用于實現各種特效。PerspectiveTransform特效可以使Node對象實現透視變換。因此我們可以通過計算透視變換中每個點的位置來實現3D翻轉特效。
    2013-04-04
  • 解決springboot項目啟動報錯Error creating bean with name dataSourceScriptDatabaseInitializer問題

    解決springboot項目啟動報錯Error creating bean with&nb

    這篇文章主要介紹了解決springboot項目啟動報錯Error creating bean with name dataSourceScriptDatabaseInitializer問題,具有很好的參考價值,希望對大家有所幫助
    2024-03-03
  • Spring Security 將用戶數據存入數據庫

    Spring Security 將用戶數據存入數據庫

    這篇文章主要介紹了Spring Security 如何將用戶數據存入數據庫,幫助大家更好的理解和學習Spring Security,感興趣的朋友可以了解下
    2020-09-09
  • 一文詳解Java中的動態(tài)填充Html模版并轉PDF

    一文詳解Java中的動態(tài)填充Html模版并轉PDF

    在后端技術中,模板引擎和PDF生成工具是兩個非常重要的領域,Thymeleaf和wkhtmltopdf是這兩個領域的杰出代表,下面就來詳細介紹一下Thymeleaf和wkhtmltopdf的技術特點吧
    2023-12-12

最新評論

呼玛县| 福清市| 海城市| 牡丹江市| 张家川| 宁阳县| 承德市| 禹城市| 化隆| 广灵县| 宁海县| 汕头市| 噶尔县| 长武县| 吉木萨尔县| 清新县| 白河县| 弥勒县| 连南| 大田县| 玉林市| 合阳县| 巫溪县| 无棣县| 南华县| 新乡县| 邹平县| 霍邱县| 海门市| 三河市| 桑日县| 莒南县| 柳林县| 东乡族自治县| 铜梁县| 五华县| 杭锦旗| 平安县| 上虞市| 平利县| 浠水县|