1. 程式人生 > >java之單例模式

java之單例模式

第一種(懶漢,執行緒不安全):

			Java程式碼  
			public class Singleton {  
				private static Singleton instance;  
				private Singleton (){}  
			  
				public static Singleton getInstance() {  
				if (instance == null) {  
					instance = new Singleton();  
				}  
				return instance;  
				}  
			}  
 

 這種寫法lazy loading很明顯,但是致命的是在多執行緒不能正常工作。

第二種(懶漢,執行緒安全):

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

 這種寫法能夠在多執行緒中很好的工作,而且看起來它也具備很好的lazy loading,但是,遺憾的是,效率很低,99%情況下不需要同步。

第三種(餓漢):

				Java程式碼  
				public class Singleton {  
					private static Singleton instance = new Singleton();  
					private Singleton (){}  
					public static Singleton getInstance() {  
					return instance;  
					}  
				}  
				 

 這種方式基於classloder機制避免了多執行緒的同步問題,不過,instance在類裝載時就例項化,雖然導致類裝載的原因有很多種,在單例模式中大多數都是呼叫getInstance方法, 但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,這時候初始化instance顯然沒有達到lazy loading的效果。

第四種(餓漢,變種):

			Java程式碼  
			public class Singleton {  
				private Singleton instance = null;  
				static {  
				instance = new Singleton();  
				}  
				private Singleton (){}  
				public static Singleton getInstance() {  
				return this.instance;  
				}  
			}  
 

 表面上看起來差別挺大,其實更第三種方式差不多,都是在類初始化即例項化instance。

第五種(靜態內部類):

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

這種方式同樣利用了classloder的機制來保證初始化instance時只有一個執行緒,它跟第三種和第四種方式不同的是(很細微的差別):第三種和第四種方式是隻要Singleton類被裝載了,那麼instance就會被例項化(沒有達到lazy loading效果),而這種方式是Singleton類被裝載了,instance不一定被初始化。因為SingletonHolder類沒有被主動使用,只有顯示通過呼叫getInstance方法時,才會顯示裝載SingletonHolder類,從而例項化instance。想象一下,如果例項化instance很消耗資源,我想讓他延遲載入,另外一方面,我不希望在Singleton類載入時就例項化,因為我不能確保Singleton類還可能在其他的地方被主動使用從而被載入,那麼這個時候例項化instance顯然是不合適的。這個時候,這種方式相比第三和第四種方式就顯得很合理。

第六種(列舉):

			Java程式碼  
			public enum Singleton {  
				INSTANCE;  
				public void whateverMethod() {  
				}  
			}  
			 

 這種方式是Effective Java作者Josh Bloch 提倡的方式,它不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件,可謂是很堅強的壁壘啊,不過,個人認為由於1.5中才加入enum特性,用這種方式寫不免讓人感覺生疏,在實際工作中,我也很少看見有人這麼寫過。

第七種(雙重校驗鎖):

		Java程式碼  
		public class Singleton {  
			private volatile static Singleton singleton;  
			private Singleton (){}  
			public static Singleton getSingleton() {  
			if (singleton == null) {  
				synchronized (Singleton.class) {  
				if (singleton == null) {  
					singleton = new Singleton();  
				}  
				}  
			}  
			return singleton;  
			}  
		}  

相關推薦

java模式:餓漢式、懶漢式、雙重校驗鎖、列舉、靜態內部類

一、餓漢式: /** * 餓漢式: * 不存在多執行緒同步問題,當類被載入時,初始化並分配記憶體空間; * 當類被解除安裝時,才釋放所佔記憶體,因此在某些特定條件下會耗費記憶體。 * * @author: Rodge * @time: 2018年10月4日 下午4:35:12 * @

java模式

第一種(懶漢,執行緒不安全): Java程式碼 public class Singleton { private static Singleton instance; private Singleton (){}

從零開始學Java模式:懶漢模式和飽漢模式

單例模式:單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。

Java模式的各種實現

最近連續在各種群裡、部落格裡看到單例模式的討論。根據我的理解總結一下: 先直接說結論:最優雅最簡潔最穩的方法是使用列舉實現單例模式。 餓漢式 //無懶載入 //在類載入時初始化唯一的例項物件,由jvm在多執行緒環境時保證執行緒安全 //增加了初始化的時

java模式的七種寫法

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

JAVA設計模式模式(轉)

單例對象 日誌 locking anti 常見 基本上 title 加載 懶漢式 本文繼續介紹23種設計模式系列之單例模式。 概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裏主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特

Java設計模式模式

設計 return 線程安全 -s ron none 方法 有一個 ava   一、前言:   轉載需要註明出處: https://i.cnblogs.com/EditPosts.aspx?opt=1   單例模式其實很早之前就已經接觸過了,但都是為了應付面試或者是為了裝X

Java基礎 模式懶漢式

懶漢 私有 珍惜 src pac auth 如果 x64 version 禮悟: 好好學習多思考,尊師重道存感恩。葉見尋根三返一,活水清源藏於零。 虛懷若谷良心主,皓月當空自在王。願給最苦行無悔,誠勸且行且珍惜。 os :

java學習模式(餓漢式與懶漢式)

分用 單例設計 單例 null 並發 auth 設計 pack 過多 ---恢復內容開始--- 設計模式:解決某一類問題最行之有效的方法 java中有23種設計模式 今天學習其中一種:單例設計模式:解決一個類在內存只存在一個對象 想要保證對象唯一。 1.為了避免其他程序

Java設計模式模式(七種寫法)

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

設計模式模式(Java實現版)

單例模式作用在一個類上,這個類提供了一種方法來訪問它的唯一物件,可以直接訪問,而不需要例項化類的物件。單例模式的作用是保證一個類只有一個物件例項。 class Singleton { private static Singleton instance = new Singleton()

Java小白如何初步掌握java設計模式模式

單例設計模式(Singleton Pattern)是最簡單且常見的設計模式之一,主要作用是提供一個全域性訪問且只例項化一次的物件,避免多例項物件的情況下引起邏輯性錯誤(例項化數量可控)… 概述 Java中,單例模式主要分三種:懶漢式單例、餓漢式單例、登記式單例三種。 特點

Java設計模式模式(SingleInstance)

模式定義 需求背景 具體實現 模式定義 單例:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 需求背景 在App程序中保證類的例項唯一性,例如資料庫訪問入口等。

java高階設計模式模式

一、定義 保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 二、結構和說明  三、基本實現 四、認識單例模式    1、單例模式的功能         單例模式的功能是用來保證這個

Java多執行緒學習筆記21模式與多執行緒

詳細程式碼見:github程式碼地址   第六章 單例模式與多執行緒 前言: 我之前已經開設了23個設計模式這個專欄,介紹了很多的Java設計模式,其中一些模式對於絕 大多數程式語言設計思想都是類似的,需要了解單例模式的可以去看看。 我們在實際開發中經常用到單例模式,但

設計模式(建立型):Java常用23種設計模式模式詳解以及Java程式碼實現

可以說單例模式是所有設計模式中最簡單的一種。 單例模式就是說系統中對於某類的只能有一個物件,不可能出來第二個。 單例模式也是23中設計模式中在面試時少數幾個會要求寫程式碼的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。 1.多執行緒安全單例模式例項一(不使用同步鎖)

java中的設計模式模式、工廠模式

Java中的設計模式            轉載地址:https://www.toutiao.com/i6573486403282272775/ 為什麼要學習設計模式 1)設計模式都是一些相對優秀的解決方案,很多問題都是典型的

java 設計模式模式 一篇就夠了

單例模式 單例物件(Singleton)是一種常用的設計模式。 在Java應用中,單例物件能保證在一個JVM中,該物件只有一個例項存在。這樣的模式有幾個好處: 1、某些類建立比較頻繁,對於一些大型的

Java設計模式模式(Singleton)

單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。 這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可

java程式設計師面試必備:Java 設計模式模式

有些時候,我們想要一個類在整個系統中僅存在一個例項。比如說,系統給我們提供了一個印表機硬體設施,但是我們在系統中多次new 印表機,創建出多個印表機的例項去完成列印任務,那麼這個時候就會出現資源衝突現象,這就要求我們必須想一個辦法,去確保系統中存在唯一的一個印表機例項,解決方