1. 程式人生 > >Singleton單例模式的幾種建立方法

Singleton單例模式的幾種建立方法

建立單例類有以下幾種方式: 餓漢式 懶漢式(加同步鎖的懶漢式、加雙重校驗鎖的懶漢式、防止指令重排優化的懶漢式) 登記式單例模式 靜態內部類單例模式 列舉型別的單例模式 備註: 其中“列舉型別的單例模式。”最牛逼,可以防止反射呼叫構造器 餓漢式; public class MyManger {     private static  MyManger instance=new MyManger();     private  MyManger() {     }     public static MyManger getInstance() {         return instance;     } } 懶漢式-加同步鎖的懶漢式 public class MyManger2 {     private static MyManger2 instance;     private MyManger2() {     }     public static synchronized MyManger2 getInstance() {         if(instance==null){             instance=new MyManger2();         }         return instance;     } } 懶漢式-加雙重校驗鎖的懶漢式 public class MyManger3 {     private static MyManger3 instance;     private MyManger3() {     }     public static  MyManger3 getInstance() {         if(instance==null){             synchronized (MyManger3.class){                 if(instance==null){                     instance=new MyManger3();                 }             }         }         return instance;     } } 懶漢式-防止指令重排優化的懶漢式 public class MyManger3 {     private static volatile MyManger3 instance;     private MyManger3() {     }     public static  MyManger3 getInstance() {         if(instance==null){             synchronized (MyManger3.class){                 if(instance==null){                     instance=new MyManger3();                 }             }         }         return instance;     } } 登記式單例模式; 就是將該類名進行登記,每次呼叫前查詢,如果存在,則直接使用;不存在,則進行登記。 public class MyManger4 {     private static volatile MyManger4 instance;     private static Map<String, MyManger4> map = new HashMap<String, MyManger4>();     private MyManger4() {     }     public static MyManger4 getInstance(String name) {         if (null == name) {             name = MyManger4.class.getName();             System.out.println("name == null  --- > name == " + name);         }         if (null == map.get(name)) {             try {                 map.put(name, (MyManger4) Class.forName(name).newInstance());             } catch (InstantiationException e) {                 e.printStackTrace();             } catch (IllegalAccessException e) {                 e.printStackTrace();             } catch (ClassNotFoundException e) {                 e.printStackTrace();             }         }         return map.get(name);     } } 靜態內部類單例模式; public class MyManger5 {     private static volatile MyManger5 instance;     private MyManger5() {     }     private static class SingletonHolder {         private static MyManger5 instance = new MyManger5();     }     public static MyManger5 getInstance( ) {         return  SingletonHolder.instance;     } } 列舉型別的單例模式 在列舉中我們明確了構造方法限制為私有,在我們訪問列舉例項時會執行構造方法,同時每個列舉例項都是static final型別的,也就表明只能被例項化一次。在呼叫構造方法時,我們的單例被例項化。也就是說,因為enum中的例項被保證只會被例項化一次,所以我們的INSTANCE也就會被例項化一次。 public enum MyManger6 {     INSTANCE;     private  MyResource instance;     MyManger6() {         instance = new MyResource();     }     public  MyResource getInstance() {         return instance;     } } class MyResource {     public void doMethod() {         System.out.println("列舉型別的單例類資源");     } } 

相關推薦

模式寫法

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

模式實現方式

size ron jdk null singleton bsp 還要 一個 fin 1、餓漢式:靜態常量 特點:單例的實例被聲明成static和final變量了,在第一次加載類到內存中時就會初始化,所以會創建實例本身是線程安全的 public class Sin

Java模式實現方式

開始 名稱 常量 就是 多線程開發 靜態代碼塊 浪費 ack 多線程同步 在平時的工作、學員的學習以及面試過程中,單例模式作為一種常用的設計模式,會經常被面試官問到,甚至筆試會要求學員現場默寫,下面將會就單例模式的實現思路和幾種常見的實現方式進行簡單的分享。

模式建立方式

在建立單例模式的時候,如果單純的只考慮單例而不思考那樣做的話會產生什麼問題這樣是不嚴謹的,比如會發生執行緒安全問題,看了一些文章其中一篇寫得非常詳細有關單例模式的問題和效能比較,這篇文章http://blog.sina.com.cn/s/blog_62c7c3030100zw

高併發下最全執行緒安全的模式實現

為了節約系統資源,有時需要確保系統中某個類只有唯一一個例項,當這個唯一例項建立成功之後,我們無法再建立一個同類型的其他物件,所有的操作都只能基於這個唯一例項。 但是餓漢式單例類不能實現延遲載入,不管將來用不用始終佔據記憶體;懶漢式單例類執行緒安全控制煩瑣,而且效能受影響。可

Android 模式實現方式及簡析

一.定義: 確保某一個類只有一個例項,而且自行例項並向整個系統提供這個例項 二.使用場景: 避免產生過多的物件消耗過多的資源,或者某種型別的物件只應該有且只有一個。例如,建立一個物件需要消耗的資源過多,如訪問資料庫或者IO 資源。 三.實現單例模式的關鍵

python模式實現方法

1.方法1,程式執行過程中,某個類物件只有1個,該類物件的例項物件可以有無數個,根絕這點,讓類物件持有一個例項化物件,重寫類物件的__new__方法,始終返回持有的這個例項化物件,即可實現單例模式。 class Person1: _single = None

Java 模式實現的差別

單例模式確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 思路是通過將該類的構造方法設為private,那麼在其他類中不能直接例項化該類。那麼為了得到該類的例項,需要有public的static方法來返回該類的例項。(之所以static是為了可以直接用

Singleton模式建立方法

建立單例類有以下幾種方式: 餓漢式 懶漢式(加同步鎖的懶漢式、加雙重校驗鎖的懶漢式、防止指令重排優化的懶漢式) 登記式單例模式 靜態內部類單例模式 列舉型別的單例模式 備註: 其中“列舉型別的單例模式。”最牛逼,可以防止反射呼叫構造器 餓漢式; public clas

Singleton模式實現方法

單例模式原理: 單例模式又叫做 Singleton模式,指的是一個類,在一個JVM裡,只有一個例項存在。 關鍵要實現三點: 1. 構造方法私有化,使得外部無法通過new 得到新的例項 2. 靜態屬

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

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

java寫法

多線程 ibm 顯示 詳細 作者 jdk1.5 需要 fin serial 轉載出處:http://cantellow.javaeye.com/blog/838473 第一種(懶漢,線程不安全): 1 public class Singleton { 2 pr

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

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

java 模式5寫法

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

模式模式,餓漢(饑漢)、飽漢(懶漢)、雙重鎖模式

singleton pub null 關系 設計模式的 mage 了吧 ref image 今天看某培訓機構提供面試題中設計模式部分,對飽漢和餓漢比較感興趣,就搜了一下,然後誤人子弟,然後就覺得有必要記錄一下 聲明:本人沒有看過設計模式的書籍,只是根據概念對比的看了一些博

模式--模式8寫法

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

模式寫法

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

C++之智慧指標和普通指標模式實現

1  問題 實現c++的單例模式,這裡測試分別寫了通過智慧指標返回物件和普通返回指標     2  程式碼測試 include <iostream> #include <mutex> #include <m

pandas.Series()的建立方法

前些日子的數學建模,最近的kaggle比賽,再到現在做的一個小專案,發現pandas真是一個好東西,可惜之前不太會用,需要用的時候就去上網搜,效率極其低下,現在把這一部分知識過一遍,以便日後使用。今天的主題:pandas.Series()的幾種建立方法。 import numpy a

java 設計模式 --singleton 模式

Singleton 單例模式:         有些物件只需要一個,比如:執行緒池、快取、對話方塊、處理偏好設定和登錄檔的物件、日誌物件,充當印表機、顯示卡等裝置的驅動程式的物件。