1. 程式人生 > >JAVA單例模式6種寫法(附反射破壞單例)

JAVA單例模式6種寫法(附反射破壞單例)

java中單例模式是一種常見的設計模式,單例模式的寫法有多種,這裡主要介紹6種寫法:餓漢式單例、懶漢式單例3個、靜態內部類,列舉。
  單例模式有以下特點:
  1、單例類只能有一個例項。
  2、單例類必須自己建立自己的唯一例項。
  3、單例類必須給所有其他物件提供這一例項。

一.單例寫法
<1>餓漢式單例

//餓漢式單例類.在類初始化時例項化   
public class Singleton {  
    private Singleton() {}  
    private static final Singleton single = new Singleton();  
    //靜態工廠方法   
public static Singleton getInstance() { return single; } }

此種方式在類載入的時候就初始化例項,沒有達到懶載入的效果,但是,它是執行緒安全的
<2>懶漢式1

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  

    public static Singleton getInstance() {  
    if (instance == null
) { instance = new Singleton(); } return instance; } }

實現懶載入,不是執行緒安全的
<3>懶漢式2(同步方法)

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null
) { instance = new Singleton(); } return instance; } }

使用同步方法形式,實現懶載入和執行緒安全,但是效率很低,多數情況下並不需要同步。
<4>懶載入3(雙重校驗鎖)

public class Singleton {  
    private static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}  

實現懶載入,執行緒安全,效率與同步方法形式有提高
<5>靜態內部類

public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}  

這種比懶漢形式要好一些,既實現了執行緒安全,又避免了同步帶來的效能影響。
<6>列舉形式

public enum Singleton {  
    INSTANCE;  
    //任意方法,呼叫時使用INSTANCE.方法名
    public void whateverMethod() {  
    }  
}  

程式碼少,又實現了執行緒安全,又可避免反射破壞單例模式。

總結:還有一種登記式單例,以後學習。沒有如果懶載入要求可使用餓漢式。執行緒安全懶載入使用靜態內部類,涉及反序列化建立物件使用列舉。如果使用熟練列舉是個不錯的選擇,程式碼很簡單。

備註:連結中防止破壞單例程式碼標誌位flag設定有問題;

相關推薦

JAVA模式6寫法反射破壞

java中單例模式是一種常見的設計模式,單例模式的寫法有多種,這裡主要介紹6種寫法:餓漢式單例、懶漢式單例3個、靜態內部類,列舉。   單例模式有以下特點:   1、單例類只能有一個例項。   2、單例類必須自己建立自己的唯一例項。   3、單例類必須給

Java氣泡排序的6寫法1

/** * */ package ch02; /** * @author Administrator *sorting algorithm */ public class javaData1 { // public static void sw

java 模式5寫法

浪費 get public color ring 缺點 threads 構造函數 java 單例模式 學習整理 飽漢模式(懶漢模式) 1 // 飽漢 2 // UnThreadSafe 3 public class Singleton1 { 4 private

面試題模式寫法

第一種形式:餓漢式單例 public class Singleton { private Singleton(){} private static Singleton i

模式寫法

遺憾 想象 develop 由於 tcl loader adr 希望 線程不安全 第一種(懶漢,線程不安全): Java代碼 public class Singleton { private static Singleton instance;

模式--模式8寫法

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

模式寫法

單例模式算是設計模式中最容易理解,也是最容易手寫程式碼的模式了吧。但是其中的坑卻不少,所以也常作為面試題來考。本文主要對幾種單例寫法的整理,並分析其優缺點。很多都是一些老生常談的問題,但如果你不知道如何建立一個執行緒安全的單例,不知道什麼是雙檢鎖,那這篇文章可能會幫助到你。 1、懶漢式(執

模式8寫法

1、餓漢式(靜態常量)[可用] public class Singleton { ​ private final static Singleton INSTANCE = new Singleton(); ​ private Singleton(){} ​ public sta

模式6實現方式

一:餓漢式public class MyObject { // 立即載入方式==餓漢模式 private static MyObject myObject = new MyObject();

模式7寫法

第一種(懶漢,執行緒不安全):  1 publicclass Singleton {   2 privatestatic Singleton instance;   3     privateSingleton (){}    4 publicstatic Single

模式6實現及利弊分析

[TOC] # 單例模式6種實現及利弊分析 單例模式三要素 - **私有的構造方法;** - **指向自己例項的私有靜態引用;** - **以自己例項為返回值的靜態的公有方法** ## **1.餓漢式** ```java public class Singleton { private

的幾方式,以及如何破壞,使用枚舉保護

des new 如果 auth 變量 ins 方式 break 時機 1、基礎入門單例: 1 public class Singleton { 2 private Singleton(){ 3 System.out.println("Sing

JAVA構造物件的幾方式構建器、構造器

大家好,我是烤鴨:    今天說一下初始化物件的幾種方式:        1.    多引數構造器        2.    構建器        3.    構造器後 + get/set方法舉個例子:    這裡有個機構entity,提供一個預設構造器package com

設計模式 - 模式之多執行緒除錯與破壞

前言 在之前的 設計模式 - 單例模式(詳解)看看和你理解的是否一樣? 一文中,我們提到了通過Idea 開發工具進行多執行緒除錯、單例模式的暴力破壞的問題;由於篇幅原因,現在單獨開一篇文章進行演示:執行緒不安全的單例在多執行緒情況下為何被建立多個、如何破壞單例。 如果還不知道如何使用IDEA工具進行執行緒模

3.7 Java之列印流和資料流字元位元組流練習

列印流 例項 資料流 資料流輸出 資料流輸入 字元位元組流練習 位元組流輸出 字元流輸出

設計模式的幾寫法java版本、超詳細

簡介 單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。這篇部落格很精彩哦,請一定要耐心看完哦 在Java設計模式中,單例模式相對來說算是比較簡單的一種構建模式。適用的場景在於:對於定義的一個類,在整個應用程式執行期間只有唯一的一個例項物件。如Android中常見的

模式6寫法及不同精華版

1、懶漢模式。執行緒不安全,但可以延遲  【不推薦,不使用】 <span style="font-size:12px;">public class Singleton1 { private static Singleton1 singleton1=nul

java:模式的七寫法

單例模式是面向物件中不可缺少的一種設計模式。只要是寫過面向物件程式的人都知道。轉自:http://www.blogjava.net/kenzhh/archive/2013/03/15/357824.html第一種(懶漢,執行緒不安全):  1 publicclass Singleton {   2 priva

Java併發程式設計中的設計模式解析(二)一個的七寫法

Java單例模式是最常見的設計模式之一,廣泛應用於各種框架、中介軟體和應用開發中。單例模式實現起來比較簡單,基本是每個Java工程師都能信手拈來的,本文將結合多執行緒、類的載入等知識,系統地介紹一下單例模式的演變,並體現在7種不同的單例設計中。說到這個,非常像孔乙己裡那個“回字有四種寫法”的梗,不過與封建迂腐

設計模式模式介紹及8寫法餓漢式、懶漢式、Double-Check、靜態內部類、列舉

# 一、餓漢式(靜態常量) 這種餓漢式的單例模式構造的步驟如下: 1. 構造器私有化;(防止用new來得到物件例項) 2. 類的內部建立物件;(因為1,所以2) 3. 向外暴露一個靜態的公共方法;(getInstance) 示例: ```java class Singleton{ //