Java中的單例模式是什么-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的佛山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

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

單例模式是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一,屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。單例模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。

為了保證內(nèi)存中有且僅有一個(gè)對(duì)象,避免頻繁的創(chuàng)建對(duì)象造成對(duì)內(nèi)存的消耗,讓所有需要調(diào)用這個(gè)對(duì)象的地方都使用這一個(gè)單例對(duì)象。

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

1、懶漢式

懶漢式指的是在需要使用的時(shí)候才會(huì)去創(chuàng)建該單例對(duì)象。

懶漢式單例模式實(shí)現(xiàn):

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

對(duì)于懶漢式單例實(shí)現(xiàn)存在一個(gè)問題,就是如何確保只創(chuàng)建一個(gè)對(duì)象?若兩個(gè)或多個(gè)線程同時(shí)判斷singleton為空,則會(huì)創(chuàng)建多個(gè)對(duì)象。因此我們需要解決線程安全問題。

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

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

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

這兩個(gè)方法,能解決多線程同時(shí)創(chuàng)建單例對(duì)象的問題,但每次獲取對(duì)象都需要先獲取鎖,并發(fā)性能差。因此還需要優(yōu)化,優(yōu)化目標(biāo)為:如果沒有實(shí)例化對(duì)象,則加鎖創(chuàng)建,如果有實(shí)例化對(duì)象,則直接返回。

(學(xué)習(xí)視頻推薦:java課程)

對(duì)于在方法上加鎖,無論是否存在實(shí)例化對(duì)象都需要加鎖。故我們需要優(yōu)化的是在類對(duì)象上加鎖。

//DCL單例模式(Double Check + Lock)
public class Singleton {
	//volatite關(guān)鍵詞防止指令重排序,下文介紹
	private static volatile Singleton singleton;
	private Singleton(){}
	public static Singleton getInstance() {
	//如果singleton不為空,則直接返回對(duì)象,若多個(gè)線程發(fā)現(xiàn)singleton為空,則進(jìn)入分支
		if (singleton == null) {
		//多個(gè)線程同時(shí)爭(zhēng)搶一個(gè)鎖,只有一個(gè)線程能成功,其他線程需等待
			synchronized(Singleton.class) {
			//爭(zhēng)搶到鎖的線程需再次判斷singleton是否為空,因?yàn)橛锌赡鼙簧蟼€(gè)線程實(shí)例化了
			//若不為空則實(shí)例化,后續(xù)線程再進(jìn)入的時(shí)候則直接返回該對(duì)象
			//對(duì)于之后所有進(jìn)入該方法的線程則無需獲取鎖,直接返回對(duì)象   
        	if (singleton == null) {
           		singleton = new Singleton();
        	}
    		}
		}
    	return singleton;
	}	
}

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

2、餓漢式

餓漢式指的是在類加載時(shí)即創(chuàng)建該單例對(duì)象。

餓漢式單例模式實(shí)現(xiàn):

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

總結(jié):

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

餓漢式: 類加載時(shí)就已經(jīng)實(shí)例化對(duì)象,如果對(duì)內(nèi)存要求不高即采用餓漢式,簡(jiǎn)單不易出錯(cuò),且沒有任何并發(fā)安全和性能問題。

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

網(wǎng)站名稱:Java中的單例模式是什么-創(chuàng)新互聯(lián)
鏈接分享:http://muchs.cn/article18/cshgdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)建站公司、網(wǎng)站設(shè)計(jì)公司、App開發(fā)、App設(shè)計(jì)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)