1. 程式人生 > >java中的6種單例寫法

java中的6種單例寫法

在java中,單例有很多種寫法,面試時,手寫程式碼環節,除了寫演算法題,有時候也會讓手寫單例模式,這裡記錄一下單例的幾種寫法和優缺點。
  • 1.初級寫法
  • 2.加鎖
  • 3.餓漢式
  • 4.懶漢式
  • 5.雙重加鎖
  • 6.內部類

1.初級寫法

package com.java4all.test6;

/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:單例模式 -- 初級
 */
public class Singleton {

    private static Singleton singleton = null;

    public Singleton() {
    }

    /**併發下會產生多個示例*/
    public static Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

2.加鎖

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;
    }
}

3.餓漢式

package com.java4all.test6;

/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:餓漢式單例模式--類初始化時就自行例項化
 */
public class ESingleton {

    /**類在載入的時候直接進行初始化*/
    private static final ESingleton ESINGLETON = new ESingleton();

    private ESingleton() {}

    /**對外暴露唯一介面  提供單例物件*/
    public static ESingleton geteSingleton(){
        return ESINGLETON;
    }
}

4.懶漢式

package com.java4all.test6;

/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:懶漢式單例模式
 * 第一次呼叫時例項化
 */
public class BSingleton {
    
    private static BSingleton bSingleton = null;

    private BSingleton() {
    }

    /**
     * 整個方法鎖住了,效率較低
     * @return
     */
    public synchronized static BSingleton getbSingleton(){
        if(bSingleton == null){
            bSingleton = new BSingleton();
        }
        return bSingleton;
    }
}

5.雙重加鎖

雙重非空判斷,new物件前加一次鎖。

volatile關鍵字,考慮的是,new關鍵字在虛擬機器中執行時其實分為很多步驟,具體原因可以參考深入理解java虛擬機器一書。

package com.java4all.test6;

/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:雙重加鎖
 */
public class SynchronizedSingleton {

    /**volatile防止指令重排*/
    private static volatile SynchronizedSingleton singleton;

    private SynchronizedSingleton() {
    }

    /**只是在例項為空時才進行同步建立
     * 為什麼做了2次判斷?
     * A執行緒和B執行緒同時進入同步方法0
     * 然後都在1位置處判斷了例項為null
     * 然後都進入了同步塊2中
     * 然後A執行緒優先進入了同步程式碼塊2中(B執行緒也進入了),然後建立了例項
     * 此時,如果沒有3處的判斷,那麼A執行緒建立例項同時,B執行緒也會建立一個例項
     * 所以,還需要做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.內部類

package com.java4all.test6;

/**
 * Author: yunqing
 * Date: 2018/9/15
 * Description:靜態內部類
 * 優點:1.延遲,外部類初始化時不會進行例項建立,要用時才會建立
 *      2.安全,靜態成員變數
 */
public class FSingleton {

    private FSingleton() {
    }

    public static FSingleton getInstance(){
        return Singleton.fSingleton;
    }

    private static class Singleton{
        private static FSingleton fSingleton = new FSingleton();
    }
}

相關推薦

java6寫法

在java中,單例有很多種寫法,面試時,手寫程式碼環節,除了寫演算法題,有時候也會讓手寫單例模式,這裡記錄一下單例的幾種寫法和優缺點。 1.初級寫法 2.加鎖 3.餓漢式 4.懶漢式 5.雙重加鎖 6

java如何運用和多

單例多例需要搞明白兩個問題: 1. 什麼是單例多例; 2. 如何產生單例多例; 3. 為什麼要用單例多例 4. 什麼時候用單例,什麼時候用多例; 1. 什麼是單例、多例: 所謂單例就是所有的請求都用一個物件來處理,比如我們常用的service和dao

C#模式

一、經典模式:     public class DoSomething     {         private static DoSomething doSomething;         private DoSomething() { }         pu

Java列舉實現模式

public enum Singleton { INSTANCE; private SingletonClass instance; Singleton() { this.instance = new Singleto

6模式實現

普通懶漢式 public class Singleton { /** 單例物件 */ private static Singleton instance; /** * 私有構造方法. */ priva

史上最全的七寫法——設計模式

什麼是單例 單例模式確保某各類只有一個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池、快取、日誌

模式作用特點及常見的模式分析(6模式分析)

單例模式: 即在整個生命週期中,對於該物件的生產始終都是一個,不曾變化。 保證了一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 作用: 在要求執行緒安全的情況下,保證了類例項的唯一性,執行緒安全。 在不需要多例項存在時,保證了類例項的單一性。不浪費記憶體。 特點: 公有的方法獲取例項, 私有的

快速理解Java的五模式

嵌套類 ati class 由於 aop 適合 singleton 重復 code 解法一:只適合單線程環境(不好) package test; /** * @author xiaoping * */ public class Singleton { pri

Java設計模式之模式(七寫法

不一定 java設計 font method 防止 turn 無法 lazy 三種 Java設計模式之單例模式(七種寫法) 第一種,懶漢式,lazy初始化,線程不安全,多線程中無法工作: public class Singleton { private stati

java設計模式之模式(幾寫法及比較)

概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裡主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特點:  1、單例類只能有一個例項。  2、單例類必須自己建立自己的唯一例項。  3、單例類必須給所有其他物件提供這一例項。 

Java常見的模式以及各自優缺點總結

餓漢式實現:餓漢式單例模式程式碼中,static變數會在類裝載時初始化,此時也不會涉及多個執行緒物件訪問該物件的問題。虛擬機器保證只會裝載一次該類,肯定不會發生併發訪問的問題。因此,可以省略synchronized關鍵字。問題:如果只是載入本類,而不是呼叫getInstan

Java設計模式之模式的幾寫法

第一種 public class Singleton{ public static class SingletonHolder{ public static Singleton instance = new Singleton();

JAVA23設計模式之模式

1. 最簡單的單例模式 什麼叫單例模式:口語表達就是——一個類有且僅有一個物件,外部無法例項化它的新物件。只能通過呼叫的getXXX()方法來例項化物件,這個方法是自定義的。 最簡單的單例模式例子

java設計模式(模式,介面卡模式,簡單工廠模式)

1、單例模式:也分餓漢式單例模式(建立物件)與懶漢式單例模式(未建立物件)程式碼實現:餓漢式單例模式:懶漢式單例模式:2、介面卡模式:介面:實現介面的類:實現介面某個方法的類:3、簡單工廠模式:介面:類1:類2:工廠類:測試類:

JAVA設計模式之模式-快速理解Java的五模式(轉)

百度百科對單例模式的介紹 顯然單例模式的要點有三個;一是某個類只能有一個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。 從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式,二是類定義中含有一個該類的靜態私有物件,三是該

Java23設計模式(附代碼樣

體會 如何解決 熱插拔 原型 原型模式 strac println template sendmai 一、設計模式分類總體來說設計模式分為三大類:創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。結構型模式,共七種:適配器模式、裝飾器模式、代理

模式的8寫法及其分析 (推薦:double check,內部類,列舉的寫法)

單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到 餓漢式 和 懶漢式 這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。 簡介 單例模式是一種常用的軟體設計模式,其定義是

Java多執行緒-----模式在多執行緒的使用用問題

   1.餓漢模式(立即載入模式)與多執行緒 不管需不需要用到例項都要去建立例項,即在類產生的時候就建立好例項 package com.thread; /** * 餓漢模式 * * @author yyx 2018年12月28日 */ public cl

Java多執行緒--模式的五實現

一、惡漢模式 在這個類還沒有使用到的時候就已經建立好了 public class Singleton{ /** *類變數在類準備階段就初始化了然後放在<clinit>構造方法中, *一旦外部呼叫了靜態方法

java設計模式之模式5方法及優缺點小結

單例設計模式的用處。 單例設計模式是指,某個類只有一個例項。在計算機系統中類似於印表機和最常見的就是工作管理員的對話方塊,不管幾個使用者同時登入windows 開啟的任務對話方塊只有一個。 常見的幾種實現方式: 1.lazy-load /*