亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的單例模式是什么

發布時間:2020-08-12 10:32:00 來源:億速云 閱讀:133 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關 Java中的單例模式是什么的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

首先我們來看看單例模式的定義:

單例模式是 Java 中最簡單的設計模式之一,屬于創建型模式,它提供了一種創建對象的最佳方式。單例模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。

為了保證內存中有且僅有一個對象,避免頻繁的創建對象造成對內存的消耗,讓所有需要調用這個對象的地方都使用這一個單例對象。

接下來我們看看單例模式的類型:

1、懶漢式

懶漢式指的是在需要使用的時候才會去創建該單例對象。

懶漢式單例模式實現:

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

對于懶漢式單例實現存在一個問題,就是如何確保只創建一個對象?若兩個或多個線程同時判斷singleton為空,則會創建多個對象。因此我們需要解決線程安全問題。

說到線程安全想到的就是加鎖了,加鎖無非是在方法或者類對象上加鎖。

//在方法上加鎖
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static synchronized Singleton getInstance() {
    	if (singleton == null) {
        	singleton = new Singleton();
    	}
    return singleton;
	}
}

//在類對象上加鎖
public class Singleton {
	private static Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance() {
    synchronized(Singleton.class) {   
        if (singleton == null) {
            singleton = new Singleton();
        }
    }
    return singleton;
	}	
}

這兩個方法,能解決多線程同時創建單例對象的問題,但每次獲取對象都需要先獲取鎖,并發性能差。因此還需要優化,優化目標為:如果沒有實例化對象,則加鎖創建,如果有實例化對象,則直接返回。

(學習視頻推薦:java課程)

對于在方法上加鎖,無論是否存在實例化對象都需要加鎖。故我們需要優化的是在類對象上加鎖。

//DCL單例模式(Double Check + Lock)
public class Singleton {
	//volatite關鍵詞防止指令重排序,下文介紹
	private static volatile Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance() {
	//如果singleton不為空,則直接返回對象,若多個線程發現singleton為空,則進入分支
		if (singleton == null) {
		//多個線程同時爭搶一個鎖,只有一個線程能成功,其他線程需等待
			synchronized(Singleton.class) {
			//爭搶到鎖的線程需再次判斷singleton是否為空,因為有可能被上個線程實例化了
			//若不為空則實例化,后續線程再進入的時候則直接返回該對象
			//對于之后所有進入該方法的線程則無需獲取鎖,直接返回對象   
        	if (singleton == null) {
           		singleton = new Singleton();
        	}
    		}
		}
    	return singleton;
	}	
}

上述代碼中添加了volatile關鍵詞防止指令重排序。

2、餓漢式

餓漢式指的是在類加載時即創建該單例對象。

餓漢式單例模式實現:

public class Singleton {
	private static final Singleton singleton = new Singleton();
	private Singleton(){
	
	}
	public static Singleton getInstance(){
		return singleton;
	}

總結:

懶漢式:需要時才去實例化對象,在開發中如果對內存要求很高即采用懶漢式,在多線程環境下,應該使用DCL單例模式,使用DCL單例模式,解決了并發安全及性能低下的問題,若添加volatile關鍵詞還能防止指令重排序而發生的NPE異常。

餓漢式: 類加載時就已經實例化對象,如果對內存要求不高即采用餓漢式,簡單不易出錯,且沒有任何并發安全和性能問題。

感謝各位的閱讀!關于 Java中的單例模式是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

连平县| 中超| 南充市| 睢宁县| 沂南县| 灵石县| 广河县| 贞丰县| 科技| 会东县| 大悟县| 台中县| 普宁市| 余庆县| 固原市| 闻喜县| 呼和浩特市| 南木林县| 九龙城区| 康平县| 虎林市| 深州市| 吉木萨尔县| 东宁县| 奈曼旗| 唐山市| 类乌齐县| 乐至县| 丰城市| 蛟河市| 玉田县| 保亭| 石首市| 西青区| 凤冈县| 卓资县| 和静县| 乌拉特前旗| 东安县| 龙里县| 柯坪县|