1. 程式人生 > >java 單例模式之執行緒安全的餓漢模式和懶漢模式

java 單例模式之執行緒安全的餓漢模式和懶漢模式

單例模式

解決的問題:保證一個類在記憶體中的物件唯一性.

比如:多程式讀取一個配置檔案時,建議配置檔案封裝成物件。會方便操作其中資料,又要保證多個程式讀到的是同一個配置檔案物件,

就需要該配置檔案物件在記憶體中是唯一的。

如何保證物件唯一性呢?
思想:
1,不讓其他程式建立該類物件。
2,在本類中建立一個本類物件。
3,對外提供方法,讓其他程式獲取這個物件。

步驟:
1,因為建立物件都需要建構函式初始化,只要將本類中的建構函式私有化,其他程式就無法再建立該類物件;
2,就在類中建立
一個私有並靜態的本類的物件
3,定義一個方法,返回該物件,讓其他程式可以通過方法就得到本類物件。(作用:可控)

程式碼體現:
1,私有化建構函式;
2,建立私有並靜態的本類物件;
3,定義公有並靜態的方法,返回該物件。

餓漢模式:

class Single{
private Single(){} //私有化建構函式。
private static Single s = new Single(); //建立私有並靜態的本類物件。
public static Single getInstance(){ //定義公有並靜態的方法,返回該物件。
return s;
}
}
//懶漢式:延遲載入方式。使用到的時候才回去初始化該物件
class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}

在多執行緒模式中,考慮到效能和執行緒安全問題,我們一般會選擇下面兩種比較經典的單例模式,在效能提高的同時,又保證了執行緒的安全.

1.static inner Class

2.dubble check instance

(餓漢模式)static inner Class-內部靜態類的形式

public class Singletion {
	
	private static class InnerSingletion {
		private static Singletion single = new Singletion();
	}
	
	public static Singletion getInstance(){
		return InnerSingletion.single;
	}
	
}


(懶漢模式) dubble check instance-為確保執行緒安全,需要兩次check

public class DubbleSingleton {

	private static DubbleSingleton ds;
	
	public  static DubbleSingleton getDs(){
		if(ds == null){
			try {
				//模擬初始化物件的準備時間...
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (DubbleSingleton.class) {
				if(ds == null){
					ds = new DubbleSingleton();
				}
			}
		}
		return ds;
	}
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(DubbleSingleton.getDs().hashCode());
			}
		},"t1");
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(DubbleSingleton.getDs().hashCode());
			}
		},"t2");
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(DubbleSingleton.getDs().hashCode());
			}
		},"t3");
		
		t1.start();
		t2.start();
		t3.start();
	}
	
}
輸出結果:
792363696
792363696
792363696





相關推薦

java 模式執行安全模式懶漢模式

單例模式 解決的問題:保證一個類在記憶體中的物件唯一性. 比如:多程式讀取一個配置檔案時,建議配置檔案封裝成物件。會方便操作其中資料,又要保證多個程式讀到的是同一個配置檔案物件, 就需要該配置檔案物件在記憶體中是唯一的。 如何保證物件唯一性呢? 思想: 1,不讓其他程式建立

模式執行安全解析

面試的時候,常常會被問到這樣一個問題:請您寫出一個單例模式(Singleton Pattern)吧。     單例的目的是為了保證執行時Singleton類只有唯一的一個例項,最常用的地方比如拿到資料庫的連線,Spring的中建立BeanFactory這些開銷比較大的操作,

執行併發問題以及設計模式執行安全以及同步方法同步程式碼塊

執行緒安全和非執行緒安全 在作業系統中,執行緒是不擁有資源的,程序擁有資源。執行緒是由程序建立的,一個程序可以建立多個執行緒,這些執行緒共享程序中的資源。當多個執行緒同時操作一個變數時,這個時候就可能會造成資料的不一致性,此時就是執行緒不安全。 JVM有主記

Spring bean bean的執行安全

Bean的作用域    Spring 3中為Bean定義了5中作用域,分別為singleton(單例)、prototype(原型)、request、session和global session,5種作用域說明如下: singleton:單例模式,Spring I

單列模式執行安全實現

單例模式有五種寫法:懶漢、餓漢、雙重檢驗鎖、靜態內部類、列舉   懶漢式執行緒不安全 public class Singleton { private static Singleton instance; private Singleton (){} publ

列舉實現原理:執行安全及發序列化依舊為原因

單例的列舉實現在《Effective Java》中有提到,因為其功能完整、使用簡潔、無償地提供了序列化機制、在面對複雜的序列化或者反射攻擊時仍然可以絕對防止多次例項化等優點,單元素的列舉型別被作者認為是實現Singleton的最佳方法。 其實現非常簡單,如下:

JAVA設計模式-模式(Singleton)執行安全與效率

一,前言   單例模式詳細大家都已經非常熟悉了,在文章單例模式的八種寫法比較中,對單例模式的概念以及使用場景都做了很不錯的說明。請在閱讀本文之前,閱讀一下這篇文章,因為本文就是按照這篇文章中的八種單例模式進行探索的。   本文的目的是:結合文章中的八種單例模式的寫法,使用實際的示例,來演示執行緒安全和效率  

設計模式模式執行安全

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

設計模式模式執行安全問題

前言 單例模式分為“餓漢模式”與“懶漢模式”。今天我們來聊聊單例模式,特別是在多執行緒中我們需要特別注意。 餓漢模式 class Singleton{ private static Singleton singleton = new Singleton(); private Singl

JAVA懶漢模式執行安全

JAVA中單例模式分為兩種 1、餓漢模式 2、懶漢模式 餓漢模式不存線上程安全問題; 而懶漢模式存線上程安全問題。詳見下文,來自網路: 單例的多執行緒執行緒安全問題的描述 通常的多執行緒的執行緒安全問題,往往被描述成"多執行緒共享執行緒例項變數" 但多執行緒下的例項變數如果

Java五種模式執行安全

單例模式是一種常用的軟體設計模式,常被用於一個類在系統中最多隻允許存在一個例項的場合,如視窗管理器、列印緩衝池、檔案系統等。在單例模式的核心結構中,只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類

java模式執行安全

package cn.yang.test.controller; /**單例模式 * Created by Dev_yang on 2016/2/26. */ public class Singl

python中模式執行安全問題

看了好多文章都是java實現的,特此寫一篇python的。 這個問題的兩種解決方案: 1.最簡單粗暴的就是在系統中先生成一個單例,就不存線上程安全問題了 2.用雙重同步鎖去實現,一把鎖加外面,一把鎖加里面: class Singleton(object): __instance

模式執行安全

package com.day3; public class SingleTonDemo { public static void main(String[] args) { SinleTonThread sinleTonThread=new SinleTonThread();

C++的模式執行安全模式懶漢/

單例模式 單例模式:是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個例項。即一個類只有一個物件例項。   實現簡單的單例模式:建構函式宣告為private或protect防止被外部函式

C++模式執行安全、記憶體釋放)

一、懶漢模式:即第一次呼叫該類例項的時候才產生一個新的該類例項,並在以後僅返回此例項。 需要用鎖,來保證其執行緒安全性:原因:多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety. 使用double-check來保證thr

【設計模式模式執行

好記性,不如爛筆頭。對於單例模式的理解和應用還是需要多多實踐,這次有感而發,寫份基於執行緒執行的單例模式。 單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部

object-c 模式執行安全

單例模式(Singleton Pattern):保證一個類只有一個例項,並且提供一個訪問它的全域性訪問點。 單例在程式設計中是最常見的設計模式之一,下面我們來實現一個單例: Singleton.h 檔案 #import <Foundation/F

C++中的模式懶漢模式模式執行安全問題)

1 教科書裡的單例模式   我們都很清楚一個簡單的單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部儲存一個private static的類指標儲存唯一的例項,例項的動作由一個public的類方法代勞,該方法也返回單例類唯一的例

Java併發程式設計執行安全執行通訊

Java多執行緒開發中最重要的一點就是執行緒安全的實現了。所謂Java執行緒安全,可以簡單理解為當多個執行緒訪問同一個共享資源時產生的資料不一致問題。為此,Java提供了一系列方法來解決執行緒安全問題。 synchronized synchronized用於同步多執行緒對共享資源的訪問,在實現中分為同步程