国产成人毛片视频|星空传媒久草视频|欧美激情草久视频|久久久久女女|久操超碰在线播放|亚洲强奸一区二区|五月天丁香社区在线|色婷婷成人丁香网|午夜欧美6666|纯肉无码91视频

synchronized 異常信息存在哪里 單例模式有幾種?如何優(yōu)化?

單例模式有幾種?如何優(yōu)化?在某些系統(tǒng)中,為了節(jié)省內(nèi)存資源和保證數(shù)據(jù)內(nèi)容的一致性,對于某些類只能創(chuàng)建一個(gè)實(shí)例,這種模式稱為singleton模式。單體模式的定義和特征Singleton模式的定義:指一個(gè)

單例模式有幾種?如何優(yōu)化?

在某些系統(tǒng)中,為了節(jié)省內(nèi)存資源和保證數(shù)據(jù)內(nèi)容的一致性,對于某些類只能創(chuàng)建一個(gè)實(shí)例,這種模式稱為singleton模式。

單體模式的定義和特征

Singleton模式的定義:指一個(gè)類只有一個(gè)實(shí)例,并且該類可以自己創(chuàng)建這個(gè)實(shí)例的模式。比如在Windows中只能打開一個(gè)任務(wù)管理器,可以避免打開多個(gè)任務(wù)管理器窗口造成的內(nèi)存資源浪費(fèi),或者每個(gè)窗口顯示內(nèi)容不一致。

在計(jì)算機(jī)系統(tǒng)中,還有Windows的回收站,操作系統(tǒng)中的文件系統(tǒng),多線程中的線程池,顯卡的驅(qū)動(dòng)對象,打印機(jī)的后臺處理服務(wù),應(yīng)用程序的日志對象,數(shù)據(jù)庫的連接池,網(wǎng)站的計(jì)數(shù)器,Web應(yīng)用程序的配置對象,應(yīng)用程序中的對話框,系統(tǒng)中的緩存,這些往往被設(shè)計(jì)成單一的案例。

Singleton模式在現(xiàn)實(shí)生活中也有廣泛應(yīng)用,比如公司CEO、部門經(jīng)理等。J2EE標(biāo)準(zhǔn)中的ServletContext和ServletContextConfig,Spring框架應(yīng)用中的ApplicationContext和數(shù)據(jù)庫中的連接池也是singleton模式。

單例模式有三個(gè)特征:

單例類只有一個(gè)實(shí)例對象;singleton對象必須由singleton類本身創(chuàng)建;singleton類為訪問singleton提供了一個(gè)全局訪問點(diǎn)。單例模式的優(yōu)點(diǎn)和缺點(diǎn)。

單例模式的優(yōu)勢:

Singleton模式可以保證內(nèi)存中只有一個(gè)實(shí)例,減少了內(nèi)存開銷??梢员苊舛啻握加觅Y源。Singleton模式設(shè)置了全局訪問點(diǎn),可以優(yōu)化和共享對資源的訪問。單一模式和。;的缺點(diǎn):

Singleton模式一般沒有接口,所以很難擴(kuò)展。如果要擴(kuò)展,除了修改原代碼,沒有第二條路,這違背了開放封閉原則。在并發(fā)測試中,單件模式不利于代碼調(diào)試。在調(diào)試期間,如果singleton中的代碼沒有完成,就不能模擬新的對象。單一模式和。;的功能代碼通常寫在一個(gè)類中。如果功能設(shè)計(jì)不合理,很容易違反單一責(zé)任原則。Singleton模式看起來很簡單,實(shí)現(xiàn)起來也很簡單。單體模式是面試中的一個(gè)高頻面試問題。希望大家好好學(xué)習(xí),掌握獨(dú)生子女模式,提升核心競爭力,給面試加分,順利拿到Offer。

單一模式和。;的應(yīng)用場景

對于Java,singleton模式可以保證在一個(gè)JVM中只有一個(gè)實(shí)例。單一模式和。;的應(yīng)用場景主要包括以下幾個(gè)方面。

對于一些需要經(jīng)常創(chuàng)建的類,使用單例可以減輕系統(tǒng)的內(nèi)存壓力,減少GC。當(dāng)一個(gè)類只需要生成一個(gè)對象時(shí),比如一個(gè)類的班長,每個(gè)人 s身份證號等。有些類在創(chuàng)建實(shí)例時(shí)會(huì)占用更多的資源,或者實(shí)例化需要很長時(shí)間,并且經(jīng)常被使用。當(dāng)一個(gè)類需要頻繁實(shí)例化,并且創(chuàng)建的對象被頻繁銷毀時(shí),比如多線程線程池、網(wǎng)絡(luò)連接池等。頻繁訪問數(shù)據(jù)庫或文件的對象。對于一些控制硬件層面的操作,或者從系統(tǒng)角度看應(yīng)該是單個(gè)控制邏輯的操作,如果有多個(gè)實(shí)例,系統(tǒng)就完全亂套了。當(dāng)需要共享對象時(shí)。因?yàn)樵趩卫J街兄荒軇?chuàng)建一個(gè)對象,所以共享這個(gè)對象可以節(jié)省內(nèi)存并加快對象訪問。如Web中的配置對象、數(shù)據(jù)庫的連接池等。singleton模式的結(jié)構(gòu)與實(shí)現(xiàn)

單一模式是最簡單的設(shè)計(jì)模式之一。通常,普通類的構(gòu)造函數(shù)是公共的,外部類可以通過 "新構(gòu)造函數(shù)() "。但是,如果將類的構(gòu)造函數(shù)設(shè)置為private,則外部類無法調(diào)用該構(gòu)造函數(shù),因此無法生成多個(gè)實(shí)例。此時(shí),類本身必須定義一個(gè)靜態(tài)私有實(shí)例,并提供一個(gè)靜態(tài)公共函數(shù)來創(chuàng)建或獲取靜態(tài)私有實(shí)例。

讓 分析了它的基本結(jié)構(gòu)和實(shí)現(xiàn)方法。

1.單例模式的結(jié)構(gòu)

單一模式和。;的主要角色如下。

Singleton類:包含一個(gè)實(shí)例并且可以自己創(chuàng)建這個(gè)實(shí)例的類。訪問類:使用單例的類。其結(jié)構(gòu)如圖1所示。

圖1單例模式的結(jié)構(gòu)圖。

2.單例模式的實(shí)現(xiàn)

單例模式通常有兩種實(shí)現(xiàn)形式。

第一種:懶惰的單一案例

這種模式的特點(diǎn)是類加載時(shí)不生成singleton,只有第一次調(diào)用getlnstance方法時(shí)才創(chuàng)建。代碼如下:

公共類LazySingleton {

private static volatile lazy singleton實(shí)例null//確保實(shí)例在所有線程中同步。

列兵LazySingleton() {

} //private防止類被外部實(shí)例化。

公共靜態(tài)同步LazySingleton getInstance() {

//在//getInstance方法之前同步

if(實(shí)例為空){

實(shí)例new LazySingleton()

}

返回實(shí)例

}

}

注意:如果你正在寫一個(gè)多線程程序,不要 不要?jiǎng)h除前面代碼中的關(guān)鍵字volatile和synchronized,否則會(huì)有線程不安全的問題。如果你不 t刪除這兩個(gè)關(guān)鍵字,可以保證線程安全,但是每次訪問都要同步,會(huì)影響性能,消耗更多資源。這就是懶單胞的缺點(diǎn)。第二種:餓漢式單例

這種模式的特點(diǎn)是,一旦加載了類,就會(huì)創(chuàng)建一個(gè)singleton,這確保了在調(diào)用getInstance方法之前該singleton已經(jīng)存在。

公共類饑餓Singleton {

私有靜態(tài)最終HungrySingleton實(shí)例new HungrySingleton()

二等兵HungrySingleton() {

}

公共靜態(tài)HungrySingleton getInstance() {

返回實(shí)例

}

}

餓了么中文singleton在創(chuàng)建類的同時(shí)創(chuàng)建了一個(gè)靜態(tài)對象供系統(tǒng)使用,以后也不會(huì)更改,所以是線程安全的,可以直接用于多線程,沒有問題。

單例模式的應(yīng)用實(shí)例

【例1】使用lazy singleton模式模擬生成美國當(dāng)前總統(tǒng)對象。

分析:每屆美國只有一位總統(tǒng),所以這個(gè)例子適合用singleton模式來實(shí)現(xiàn)。圖2是lazy singleton實(shí)現(xiàn)的結(jié)構(gòu)圖。

圖2美國總統(tǒng)發(fā)電機(jī)結(jié)構(gòu)圖

程序代碼如下:

公共類SingletonLazy {

公共靜態(tài)void main(String[] args) {

zt1總裁()

()//輸出總統(tǒng)的名字。

zt2總統(tǒng)()

()//輸出總統(tǒng)的名字。

if (zt1 zt2) {

他們是同一個(gè)人!)

}否則{

(他們不是同一個(gè)人!)

}

}

}

班長{

私有靜態(tài)易變總統(tǒng)實(shí)例null//確保實(shí)例在所有線程中同步。

//private防止類被外部實(shí)例化。

私人總裁(){

(產(chǎn)生一個(gè)總統(tǒng)!)

}

公共靜態(tài)同步總統(tǒng)getInstance() {

//向getInstance方法添加同步。

if(實(shí)例為空){

實(shí)例新總裁()

}否則{

已經(jīng)有總統(tǒng)了,新總統(tǒng)無法產(chǎn)生!)

}

返回實(shí)例

}

public void getName() {

(我是美國總統(tǒng):特朗普。)}

}

程序運(yùn)行結(jié)果如下:

產(chǎn)生一個(gè)總統(tǒng)!

我是美國總統(tǒng):特朗普。

已經(jīng)有總統(tǒng)了,新總統(tǒng)無法產(chǎn)生!

我是美國總統(tǒng):特朗普。

他們是同一個(gè)人!

【例2】用餓漢風(fēng)格的單體模式模擬生成豬八戒對象。

分析:和前面的例子類似,只有一個(gè)豬八戒,所以這個(gè)例子也適合用singleton模式實(shí)現(xiàn),所以使用了框架形式的JFrame組件。這里的豬八戒類是一個(gè)singleton類,可以定義為panel JPanel的子類,包含了保存豬八戒圖片的標(biāo)簽,客戶端表單可以獲取豬八戒對象并顯示。圖3是餓了么漢單例實(shí)現(xiàn)的結(jié)構(gòu)圖。

圖3豬八戒發(fā)電機(jī)結(jié)構(gòu)圖

程序代碼如下:

導(dǎo)入*

導(dǎo)入javax.swing.*

公共類單身者{

公共靜態(tài)void main(String[] args) {

JFrame jf新JFrame(饑餓單例模式測試)

(新網(wǎng)格布局(1,2))

容器內(nèi)容窗格()

八戒obj1()

(obj1)

八戒obj2()

(obj2)

if (obj1 obj2) {

他們是同一個(gè)人!)

}否則{

(他們不是同一個(gè)人!)

}

()

(正確)

(JFrame。出口_開_關(guān))

}

}

Bajie類擴(kuò)展JPanel {

私有靜態(tài)Bajie實(shí)例new Bajie()

大兵八戒(){

JLabel l1新JLabel(新圖像圖標(biāo)())

(l1)

}

公共靜態(tài)Bajie getInstance() {

返回實(shí)例

}

}

程序的運(yùn)行結(jié)果如圖4所示。

圖4豬八戒發(fā)電機(jī)運(yùn)行結(jié)果

單例模式的擴(kuò)展

Singleton模式可以擴(kuò)展為有限的multi-TCM模式,可以生成有限數(shù)量的實(shí)例并保存在ArrayList中,客戶需要時(shí)可以隨機(jī)獲取。其結(jié)構(gòu)圖如圖5所示。

圖5有限多實(shí)例模式的結(jié)構(gòu)圖

Spring如何解決循環(huán)依賴的問題?

你的問題太大了,很難解釋清楚。簡單來說,Spring執(zhí)行InstantiateBean中的構(gòu)造器方法來構(gòu)造一個(gè)實(shí)例。如果它是單例的,它將將其放入singletonBeanFactory的緩存中,然后執(zhí)行populateBean方法來設(shè)置屬性。循環(huán)依賴的問題通過singletonBeanFactory的緩存來解決。推薦你看看這個(gè)鏈接。作者講得非常仔細(xì)清晰。