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

詳解java中的6種單例寫法及優(yōu)缺點

 更新時間:2018年11月29日 12:06:03   作者:lightClouds917  
在java中,單例有很多種寫法,面試時,手寫代碼環(huán)節(jié),除了寫算法題,有時候也會讓手寫單例模式,這里記錄一下單例的幾種寫法和優(yōu)缺點。需要的朋友可以參考下

在java中,單例有很多種寫法,面試時,手寫代碼環(huán)節(jié),除了寫算法題,有時候也會讓手寫單例模式,這里記錄一下單例的幾種寫法和優(yōu)缺點。

1.初級寫法
2.加鎖
3.餓漢式
4.懶漢式
5.雙鎖檢驗
6.內(nèi)部類

1.初級寫法

package com.java4all.test6;
/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:單例模式 -- 初級
 */
public class Singleton {
  private static Singleton singleton = null;
  public Singleton() {
  }
  /**并發(fā)下會產(chǎn)生多個實例*/
  public static Singleton getInstance(){
    if(singleton == null){
      singleton = new Singleton();
    }
    return singleton;
  }
}

上面這種寫法,在并發(fā)環(huán)境下,會出現(xiàn)多個實例。

2.加鎖

我們優(yōu)化上面的代碼,遇到并發(fā),很容易想到加鎖,把獲取對象的方法加上關(guān)鍵字synchronized,很巧,這種寫法也稱為懶漢式單例 ,如下:

package com.java4all.test6;
/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:
 */
public class BadSynchronizedSingleton {
  private static BadSynchronizedSingleton synchronizedSingleton;
  private BadSynchronizedSingleton() {
  }
  /**
   * 缺點:等待時間長
   * 這種整個方法都同步了,效率很低
   * */
  public synchronized static BadSynchronizedSingleton getInstance(){
    if(synchronizedSingleton == null){
      synchronizedSingleton = new BadSynchronizedSingleton();
    }
    return synchronizedSingleton;
  }
}

但是,顯然,我們把整個方法都同步了,效率很低下,我們可以繼續(xù)優(yōu)化,只在創(chuàng)建實例的地方加上同步,參考5雙鎖檢驗。

3.餓漢式

餓漢式的特點是:類在加載時就直接初始化了實例。即使沒用到,也會實例化。

package com.java4all.test6;
/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:餓漢式單例模式--類初始化時就自行實例化
 */
public class ESingleton {
  /**類在加載的時候直接進(jìn)行初始化*/
  private static final ESingleton ESINGLETON = new ESingleton();
  private ESingleton() {}
  /**對外暴露唯一接口 提供單例對象*/
  public static ESingleton geteSingleton(){
    return ESINGLETON;
  }
}

4.懶漢式

懶漢式的特點是:用到這個實例時才去調(diào)用方法實例化。這個和2中的看起來是一樣的,因為這個實例化方法加了synchronized ,這樣安全一些。

package com.java4all.test6;
/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:懶漢式單例模式
 * 第一次調(diào)用時實例化
 */
public class BSingleton {
  private static BSingleton bSingleton ;
  private BSingleton() {
  }
  /**
   * 整個方法鎖住了,效率較低
   * @return
   */
  public synchronized static BSingleton getbSingleton(){
    if(bSingleton == null){
      bSingleton = new BSingleton();
    }
    return bSingleton;
  }
}

5.雙鎖檢驗

雙重非空判斷,new對象前加一次鎖。

volatile關(guān)鍵字,考慮的是,new關(guān)鍵字在虛擬機中執(zhí)行時其實分為很多步驟,具體原因可以參考深入理解java虛擬機一書(考慮的是這個new關(guān)鍵字字節(jié)碼執(zhí)行時是非原子性的),而volatile關(guān)鍵字可以防止指令重排。

package com.java4all.test6;
/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:雙鎖檢驗
 */
public class SynchronizedSingleton {
  /**volatile防止指令重排*/
  private static volatile SynchronizedSingleton singleton;
  private SynchronizedSingleton() {
  }
  /**只是在實例為空時才進(jìn)行同步創(chuàng)建
   * 為什么做了2次判斷?
   * A線程和B線程同時進(jìn)入同步方法0
   * 然后都在1位置處判斷了實例為null
   * 然后都進(jìn)入了同步塊2中
   * 然后A線程優(yōu)先進(jìn)入了同步代碼塊2中(B線程也進(jìn)入了),然后創(chuàng)建了實例
   * 此時,如果沒有3處的判斷,那么A線程創(chuàng)建實例同時,B線程也會創(chuàng)建一個實例
   * 所以,還需要做2次判斷
   * */
  public static SynchronizedSingleton getInstance(){//0
    if(singleton == null){//1
      synchronized (SynchronizedSingleton.class){//2
        if(singleton == null){//3
          singleton = new SynchronizedSingleton();//4
        }
      }
    }
    return singleton;
  }
}

6.內(nèi)部類

package com.java4all.test6;
/**
 * Author: yunqing
 * Date: 2018/9/15
 * Description:靜態(tài)內(nèi)部類
 * 優(yōu)點:1.延遲,外部類初始化時不會進(jìn)行實例創(chuàng)建,要用時才會創(chuàng)建
 *   2.安全,靜態(tài)成員變量
 */
public class FSingleton {
  private FSingleton() {
  }
  public static FSingleton getInstance(){
    return Singleton.fSingleton;
  }
  private static class Singleton{
    private static FSingleton fSingleton = new FSingleton();
  }
}

總結(jié)

以上所述是小編給大家介紹的java中的6種單例寫法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 解決使用ProcessBuilder踩到的坑及注意事項

    解決使用ProcessBuilder踩到的坑及注意事項

    這篇文章主要介紹了解決使用ProcessBuilder踩到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MybatisPlus 主鍵策略之type=IdType.ASSIGN_ID等詳解

    MybatisPlus 主鍵策略之type=IdType.ASSIGN_ID等詳解

    雪花算法(雪花)是微博開源的分布式ID生成算法其核心思想就是:使用一個64位的長型的數(shù)字作為全局唯一ID,這篇文章主要介紹了MybatisPlus 主鍵策略(type=IdType.ASSIGN_ID等詳解),需要的朋友可以參考下
    2024-04-04
  • Springboot如何設(shè)置靜態(tài)資源緩存一年

    Springboot如何設(shè)置靜態(tài)資源緩存一年

    這篇文章主要介紹了Springboot如何設(shè)置靜態(tài)資源緩存一年,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot解決循環(huán)調(diào)用問題

    SpringBoot解決循環(huán)調(diào)用問題

    作者在將SpringBoot從1.5版本升級至2.6版本,并遷移至阿里云上運行后,遇到了循環(huán)調(diào)用問題,在Jetty容器中運行沒問題,但在Tomcat容器中就出現(xiàn)了循環(huán)引用問題,原因是SpringBoot 2.6不鼓勵循環(huán)引用,暴露出該問題,作者提供了兩種解決思路
    2024-10-10
  • java實現(xiàn)XML增加元素操作簡單示例

    java實現(xiàn)XML增加元素操作簡單示例

    這篇文章主要介紹了java實現(xiàn)XML增加元素操作,結(jié)合簡單實例形式分析了java針對xml格式數(shù)據(jù)的讀取、遍歷、創(chuàng)建等操作技巧,需要的朋友可以參考下
    2017-02-02
  • java 實現(xiàn)迷宮回溯算法示例詳解

    java 實現(xiàn)迷宮回溯算法示例詳解

    這篇文章主要介紹了java 實現(xiàn)迷宮回溯算法示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring Security OAuth2認(rèn)證授權(quán)示例詳解

    Spring Security OAuth2認(rèn)證授權(quán)示例詳解

    這篇文章主要介紹了Spring Security OAuth2認(rèn)證授權(quán)示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 一次 Java 內(nèi)存泄漏的排查解決過程詳解

    一次 Java 內(nèi)存泄漏的排查解決過程詳解

    這篇文章主要介紹了一次 Java 內(nèi)存泄漏的排查過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • java 線程鎖詳細(xì)介紹及實例代碼

    java 線程鎖詳細(xì)介紹及實例代碼

    這篇文章主要介紹了java 線程鎖詳細(xì)介紹及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 關(guān)于jvm內(nèi)存如何查看

    關(guān)于jvm內(nèi)存如何查看

    本文介紹了如何在Java虛擬機(JVM)中進(jìn)行內(nèi)存管理,包括查看JVM內(nèi)存情況的常用方法和工具,這些方法包括使用JDK自帶的工具如jps、jstat、jmap和jconsole,以及一些第三方監(jiān)控工具如Prometheus、Grafana和ElasticStack等,通過這些方法
    2024-09-09

最新評論

龙海市| 榕江县| 临朐县| 阿拉善右旗| 江阴市| 曲水县| 鄂托克旗| 巴楚县| 长治市| 鹰潭市| 安阳市| 肇东市| 科尔| 寻甸| 阿拉尔市| 凤台县| 金寨县| 浙江省| 宁武县| 普洱| 泸溪县| 蒙阴县| 三原县| 阿城市| 纳雍县| 佛山市| 葫芦岛市| 万全县| 井研县| 龙岩市| 邻水| 定结县| 土默特左旗| 绍兴县| 乌鲁木齐县| 双峰县| 台东县| 务川| 上蔡县| 台东县| 堆龙德庆县|