黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專(zhuān)注Java教育14年 全國(guó)咨詢(xún)/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) Java單例設(shè)計(jì)模式示例

Java單例設(shè)計(jì)模式示例

更新時(shí)間:2022-03-23 11:42:35 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1839次

在本文中,我們將了解如何創(chuàng)建單例類(lèi)。閱讀本文后,您將能夠根據(jù)您的使用、簡(jiǎn)單性和消除瓶頸來(lái)創(chuàng)建您的單例類(lèi)。

在 Java 中有很多方法可以做到這一點(diǎn)。所有這些方式在模式的實(shí)現(xiàn)上都有所不同,但最終,它們都實(shí)現(xiàn)了單個(gè)實(shí)例的相同最終結(jié)果。

1.急切初始化:

這是創(chuàng)建單例類(lèi)的最簡(jiǎn)單方法。在這種情況下,類(lèi)的對(duì)象是在JVM加載到內(nèi)存時(shí)創(chuàng)建的。這是通過(guò)直接為引用分配一個(gè)實(shí)例來(lái)完成的。

當(dāng)程序總是使用這個(gè)類(lèi)的實(shí)例,或者創(chuàng)建實(shí)例的資源和時(shí)間成本不是太大時(shí),可以使用它。

// Java code to create singleton class by
// Eager Initialization
public class GFG
{
// public instance initialized when loading the class
private static final GFG instance = new GFG();
private GFG()
{
	// private constructor
}
public static GFG getInstance(){
		return instance;
	}
}

優(yōu)點(diǎn):

實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單。

可能導(dǎo)致資源浪費(fèi)。因?yàn)轭?lèi)的實(shí)例總是被創(chuàng)建,無(wú)論它是否需要。

如果不需要,CPU 時(shí)間也會(huì)浪費(fèi)在創(chuàng)建實(shí)例上。

異常處理是不可能的。

2.使用靜態(tài)塊:

這也是 Eager 初始化的子部分。唯一的區(qū)別是對(duì)象是在靜態(tài)塊中創(chuàng)建的,因此我們可以訪問(wèn)它的創(chuàng)建,例如異常處理。以這種方式,對(duì)象也是在類(lèi)加載時(shí)創(chuàng)建的。

當(dāng)使用急切初始化創(chuàng)建對(duì)象時(shí)有可能出現(xiàn)異常時(shí),可以使用它。

// Java code to create singleton class
// Using Static block
public class GFG
{
// public instance
public static GFG instance;
private GFG()
{
	// private constructor
}
static
{
	// static block to initialize instance
	instance = new GFG();
}
}

優(yōu)點(diǎn):

實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單。

無(wú)需實(shí)現(xiàn) getInstance() 方法。可以直接訪問(wèn)實(shí)例。

異常可以在靜態(tài)塊中處理。

可能導(dǎo)致資源浪費(fèi)。因?yàn)轭?lèi)的實(shí)例總是被創(chuàng)建,無(wú)論它是否需要。

如果不需要,CPU 時(shí)間也會(huì)浪費(fèi)在創(chuàng)建實(shí)例上。

3.延遲初始化:

在此方法中,僅在需要時(shí)才創(chuàng)建對(duì)象。這可以防止資源浪費(fèi)。需要返回實(shí)例的 getInstance() 方法的實(shí)現(xiàn)。有一個(gè)空檢查,如果沒(méi)有創(chuàng)建對(duì)象然后創(chuàng)建,否則返回以前創(chuàng)建的。為了確保該類(lèi)不能以任何其他方式實(shí)例化,構(gòu)造函數(shù)是最終的。由于對(duì)象是在方法中創(chuàng)建的,因此它確保除非需要,否則不會(huì)創(chuàng)建對(duì)象。實(shí)例是私有的,因此沒(méi)有人可以直接訪問(wèn)它。

它可以在單線程環(huán)境中使用,因?yàn)槎鄠€(gè)線程可以破壞單例屬性,因?yàn)樗鼈兛梢酝瑫r(shí)訪問(wèn) get 實(shí)例方法并創(chuàng)建多個(gè)對(duì)象。

//Java Code to create singleton class
// With Lazy initialization
public class GFG
{
// private instance, so that it can be
// accessed by only by getInstance() method
private static GFG instance;
private GFG()
{
	// private constructor
}
//method to return instance of class
public static GFG getInstance()
{
	if (instance == null)
	{
	// if instance is null, initialize
	instance = new GFG();
	}
	return instance;
}
}

優(yōu)點(diǎn):

只有在需要時(shí)才創(chuàng)建對(duì)象。它可以克服資源消耗和 CPU 時(shí)間的浪費(fèi)。

在方法中也可以進(jìn)行異常處理。

每次都必須檢查 null 的條件。

無(wú)法直接訪問(wèn)實(shí)例。

在多線程環(huán)境中,它可能會(huì)破壞單例屬性。

4.線程安全單例:

創(chuàng)建了一個(gè)線程安全的單例,這樣即使在多線程環(huán)境中也可以保持單例屬性。為了使單例類(lèi)線程安全,getInstance() 方法是同步的,因此多個(gè)線程不能同時(shí)訪問(wèn)它。

// Java program to create Thread Safe
// Singleton class
public class GFG
{
// private instance, so that it can be
// accessed by only by getInstance() method
private static GFG instance;
private GFG()
{
	// private constructor
}
//synchronized method to control simultaneous access
synchronized public static GFG getInstance()
{
	if (instance == null)
	{
	// if instance is null, initialize
	instance = new GFG();
	}
	return instance;
}
}

優(yōu)點(diǎn):

延遲初始化是可能的。

它也是線程安全的。

getInstance() 方法是同步的,因此會(huì)導(dǎo)致性能下降,因?yàn)槎鄠€(gè)線程無(wú)法同時(shí)訪問(wèn)它。

5.帶有雙重檢查鎖定的延遲初始化:

在這種機(jī)制中,我們克服了同步代碼的開(kāi)銷(xiāo)問(wèn)題。在此方法中,getInstance 不同步,但創(chuàng)建實(shí)例的塊是同步的,因此必須等待最少數(shù)量的線程,這只是第一次。

// Java code to explain double check locking
public class GFG
{
// private instance, so that it can be
// accessed by only by getInstance() method
private static GFG instance;
private GFG()
{
	// private constructor
}
public static GFG getInstance()
{
	if (instance == null)
	{
	//synchronized block to remove overhead
	synchronized (GFG.class)
	{
		if(instance==null)
		{
		// if instance is null, initialize
		instance = new GFG();
		}	
	}
	}
	return instance;
}
}

優(yōu)點(diǎn):

延遲初始化是可能的。

它也是線程安全的。

由于 synchronized 關(guān)鍵字,性能開(kāi)銷(xiāo)得到了降低。

第一次,它會(huì)影響性能。

6.Bill Pugh Singleton 實(shí)現(xiàn):

在Java5之前,內(nèi)存模型有很多問(wèn)題,以上方法在多線程環(huán)境中的某些場(chǎng)景下會(huì)導(dǎo)致失敗。所以,Bill Pugh 提出了一個(gè)內(nèi)部靜態(tài)類(lèi)的概念,用于單例。

// Java code for Bill Pugh Singleton Implementation
public class GFG
{
private GFG()
{
	// private constructor
}
// Inner class to provide instance of class
private static class BillPughSingleton
{
	private static final GFG INSTANCE = new GFG();
}
public static GFG getInstance()
{
	return BillPughSingleton.INSTANCE;
}
}

加載單例類(lèi)時(shí),不會(huì)加載內(nèi)部類(lèi),因此在加載類(lèi)時(shí)不會(huì)創(chuàng)建對(duì)象。只有在調(diào)用 getInstance() 方法時(shí)才會(huì)創(chuàng)建內(nèi)部類(lèi)。所以它可能看起來(lái)像急切的初始化,但它是延遲初始化。

這是最廣泛Java單例設(shè)計(jì)模式使用的方法,因?yàn)樗皇褂猛健?/p>

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 九九精品免视看国产成人 | 成年人色网站 | 欧美成视频无需播放器 | 国产亚洲精品午夜高清影院 | 日韩国产成人 | 91精品国产91热久久p | 狠狠综合视频精品播放 | 成年午夜性爽快免费视频不卡 | 一级毛片完整免费版 | 欧美日日 | 久久婷婷午色综合夜啪 | 亚洲国产欧美视频 | 国产成人啪精品视频免费网站软件 | 国产免费一级高清淫曰本片 | 黄色毛片网 | 日韩欧美亚洲综合一区二区 | 欧美成人午夜做受视频 | 久久国产精品佐山爱 | 国产亚洲人成网站天堂岛 | 黄色视频毛片 | 精品视频一区二区三区四区 | 日本成人性视频 | 日本日批视频 | 午夜私人影院 | 99精品国产在这里白浆 | 波多野结衣中文字幕在线视频 | 性欧美人与zozoxxxx视频 | 丁香色婷婷国产精品视频 | 日批视频在线免费看 | 五月婷婷久 | bbbb毛片免费看 | 日韩中文一区 | 天天操天天搞 | 国产精品青草久久 | 一区小说二区另类小说三区图 | 最近中文字幕免费完整 | 二区中文字幕 | 国产性大片黄在线观看在线放 | 国产成人综合网 | 亚洲一区二区在线免费观看 | 毛片高清 |