1. 程式人生 > >簡單java單例模式 懶漢式、餓漢式以及解決執行緒安全問題(synchronized)

簡單java單例模式 懶漢式、餓漢式以及解決執行緒安全問題(synchronized)

單例模式(又稱設計模式)

一個類只存一個物件(例項)。

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

單例模式中有懶漢式和餓漢式兩種

下面說一下懶漢式和餓漢式的區別及優點:

餓漢式不管有沒有呼叫getInstance()方法,都會預先在系統中建立一個靜態物件 懶漢式不會預先建立物件,只有在第一次呼叫時才建立物件 餓漢式優點: 在多執行緒模式下是安全的 缺點: 沒有呼叫方法前就被載入,會佔用記憶體
懶漢式優點:只有呼叫方法才建立物件,不會佔用記憶體 缺點:在多執行緒模式下不安全 舉例說明:

一個系統共享一個物件:Person類

public class Person {

	private int id;	
	public Person(int id){
		this.id = id;
	}
	public Person() {
		super();
	}
	
	public void test(){
		Singleton sing = Singleton.getInstance();
		System.out.println(sing.hashCode());
	}
}
單例模式中的懶漢式:
public class Singleton {

	//私有化構造
	private Singleton(){
		System.out.println("物件建立成功");
	}
	
	//全域性物件
	private static Singleton singleton = null;	
	
	//呼叫getInstance方法才會建立物件
	public static synchronized Singleton getInstance(){
		//判斷全域性物件是否為空
		if(singleton == null){
			//如果為空,就建立該物件
			singleton = new Singleton();
		}
		//如果不為空,返回該物件
		return singleton;
	}
	
	public static void main(String[] args) {		
		//多執行緒操作
		//2.直接使用Thread操作
		Thread thread1 = new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//
				Singleton sin = Singleton.getInstance();
				System.out.println(sin.hashCode());
			}
		};
		//開啟新執行緒
		thread1.start();
		
		Thread thread2 = new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Singleton sin2 = Singleton.getInstance();
				System.out.println(sin2.hashCode());
			}
		};		
		
		thread2.start();
			
		Person person  = new Person();
		person.test();
		
		Singleton sin3 = new Singleton();
		System.out.println(sin3.hashCode());//與上不同
單例模式中的餓漢式:
public class Singleton2 {

	//跟懶漢式的區別:直接建立物件
	private static Singleton2 ton = new Singleton2();
	
	//私有構造
	private Singleton2(){
		System.out.println("物件建立成功");
	}
	
	public static Singleton2 getInstance(){
		return ton;		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Singleton2 ton = Singleton2.getInstance();
		System.out.println(ton.hashCode());
	}
}
單例模式中的執行緒安全問題以及解決方案


懶漢式解決執行緒安全問題

public class Singleton3 {
	private Singleton3() {
		System.out.println("物件建立成功");
	}
	
	//全域性物件
	private static Singleton3 singleton=null;
	
	public static Singleton3 getInstance() {
		//判斷全域性物件是否為空
		if(singleton==null) {
			//休眠一秒鐘
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//執行緒鎖
			synchronized (Singleton3.class) {
				if(singleton==null) {
					//如果為空,就建立該類物件
					singleton=new Singleton3();
				}
			}
		}
		//如果不為空,就直接返回該物件
		return singleton;
	}
	
	public static void main(String[] args) {
		//多執行緒操作
		//2.直接使用Thread操作
		Thread thread1=new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//
				Singleton3 ton=Singleton3.getInstance();
				System.out.println(ton.hashCode());
			}
		};
		thread1.start();
		Thread thread2=new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				Singleton3 ton2=Singleton3.getInstance();
				System.out.println(ton2.hashCode());
			}
		};
		//開啟新執行緒
		thread2.start();
	}
}

深入瞭解java單例模式:http://devbean.blog.51cto.com/448512/203501/

相關推薦

簡單java模式 懶漢式以及解決執行安全問題synchronized

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

模式懶漢式區別

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

模式--懶漢式

懶漢模式(類載入時不初始化 public class LazySingleton { //懶漢式單例模式 //比較懶,在類載入時,不建立例項,因此類載入速度快,但執行時獲取物件的速度慢 private static LazySingleton intance = null;//靜態私用成

[設計模式]模式(懶漢式)

單例模式(Singleton pattern) 定義: 一種常見的軟體設計模式 目的: 應用該模式的類一個類只有一個例項。即一個類只有一個物件例項 瞭解了定義和目的後我們先來看一下兩種單例模式: 1.懶漢式(lazy): 概念: 顧名

C#/.NET 模式——懶漢式,三種實現方法

C# 單例模式 ——懶漢式,餓漢式# 註釋: /// 單例模式 /// /// 餓漢式 :第一時間建立例項,類載入就馬上建立 /// 懶漢式 :需要才建立例項,延遲載入 /// /// 單例模式會長期持有一個物件,不會釋放 /// 普通例項使用完後釋放 /// /// 單例

Java基礎 Runtime 用了模式中的

face ring lang run ice ffi new es2017 obj 禮悟: 好好學習多思考,尊師重道存感恩。葉見尋根三返一,活水清源藏於零。 虛懷若谷良心主,皓月當空自在王。願給最苦行無悔,誠勸且行且珍惜。

模式中的懶漢式

img image bubuko 圖片 bsp 懶漢 餓漢式 單例模式 http 餓漢式單例: 懶漢式單例 單例模式中的餓漢式單例和懶漢式單例

模式中,懶漢式有什麼區別?各適合用在哪裡?為什麼說推薦用模式

 餓漢式:        public class Singleton{            private static Singleton singleton = new Singleton ();            private Singleton (){}            public

Java模式中的飽和飢

Java中單例模式是筆試的常見題目,包括飽漢式和飢漢式,具體程式碼實現如下:飽漢式:public class SingleTon { private SingleTon(){} priv

模式的七種寫法, 面試題:執行安全模式

http://cantellow.iteye.com/blog/838473 http://meizhi.iteye.com/blog/537563 第一種(懶漢,執行緒不安全): Java程式碼   public class Singleton {  

Java執行安全synchronized

package tk.javazhangwei.thread.syn; /*** * 執行緒安全問題 * * @author zw * */ public class SynDemo01 { public static void main(String[]

java常用的幾種模式懶漢式登記

簡單的講,單例模式就是確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 何時用到?執行緒池、快取、日誌物件、對話方塊、顯示卡驅動程式、印表機中都用到,spring中用的最多:Spring Context Factory用的是單例,bean預設都是

模式實現方法之懶漢式

項目 只有一個 接下來 程序設計 選擇 bsp 私有 syn 屬性 Singleton 單例模式是一種經常在項目開發中使用的程序設計模式,它用於創建一個全局共享的實例對象。該實例對象在整個應用程序中只有一個,不會出現更多的該實例對象。 實現原理就是將類的構造方法私有化,即使

簡單java模式擊多次,如何讓視窗只顯示一次

1.將實現功能的建構函式設為private 2.在寫一個public的構造方法: 如下: private static AddPerson addPerson = null;  public static  synchronized AddPerson GetInstance

c++設計模式模式,懶漢,執行安全

單例模式:單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項。如何保證一個類只有一個例項並且這個例項易於被訪問呢?定義一個全域性變數可以確保物件隨時都可以被訪

模式---懶漢與模式和靜態內部類實現

單例模式是最基本的 java 設計模式之一 主要有兩種設計方法,主要分為餓漢式與懶漢式 餓漢式比較簡單,直接使用常量即可,主要程式碼如下: private static final SingleModel INSTANCE = new Sing

模式中,惡懶漢式有哪些區別。各使用在哪裡?為什麼說推薦使用惡

餓漢式:        public class Singleton{            private static Singleton singleton = new Singleton ();            private Singleton (){}  

模式懶漢與

懶漢:在初始化類的時候,不建立唯一的例項,而是等到真正需要用到的時候才建立。必須加上同步,否則有可能依然建立多個例項。餓漢:在初始化的時候,就建立了唯一的例項,不管是否需要用到。不需要自己加同步,一定產生唯一的例項。懶漢程式碼publicclassSingleton { //

第六章:單利模式懶漢式以及靜態內部類,雙重檢查

文章轉自:https://blog.csdn.net/u012453843/article/details/73743997單例模式,最常見的就是飢餓模式和懶漢模式,一個直接例項化物件,一個在呼叫方法時進行例項化物件。       大家見的最多的莫過於下面這種單例模式了,這種

Okhttp二次封裝,OkhttpClient使用模式封裝,回撥封裝成主執行,日誌攔截器

public class HttpUtils {     private static final String TAG = "HttpUtils";     private static volatile HttpUtils instance;