Java設計模式(一) 單例模式

2021-08-13 04:03:35 字數 2231 閱讀 2400

對於單例,最早可追溯到我上學那會兒的課程實習,那時候有企業裡的員工給我們進行軟體程式設計培訓,那會兒第一次聽說單例的概念。

在印象裡,

問:「你們知道如何只建立出乙個物件嗎?」

答:「不知道。為什麼只要建立乙個物件」。

問:「聽說過單例嗎?」

答:「沒有,單例是幹啥的?」

解釋:「單例就是保證程式執行期間,保證某乙個類永遠只有乙個物件,這樣既能節省空間,又能節省建立時間的開銷」。

我們:「他這是說的什麼意思?????他在說什麼??」。

其實,當我們接觸到spring之後,對於它的bean的建立,其實就是單例,就這樣糊里糊塗的開始接觸單例了。

單例的實現。

1.懶漢式單例。

/**

* 單例測試

*/public class singleton

private static singleton getsingleton()

return singleton; //3

}}

這是平時寫的最多的了,懶漢式,就是很懶,當用到的時候才去執行new的操作,只要不使用,就不會占用空間。這可能能算是優點吧。

缺點:當然,如果你從事開發時間不長,不會去在意多執行緒的情況,如果考慮了多執行緒,我們先來看看多執行緒下會出現什麼問題。

執行緒a和執行緒b同時進來,步驟1時同時發現singleton為null,都去建立singleton物件,****了不是。

2.懶漢式單例---執行緒同步 。

基於懶漢式單例,如果出現上述情況咋辦,加鎖唄,synchronized解決問題。不過加上之後總覺得變扭。大多數時候又用不上。

/**

* 單例測試

*/public class singleton

public static synchronized singleton getsingleton()

return singleton;

}}

3.餓漢式單例

/**

* 單例測試

*/public class singleton

public static singleton getsingleton()

}

餓漢式效果也很明顯,首先singleton只在類載入的時候就進行了初始化,也就new物件,同時也避免了多執行緒的問題。

缺點:非要說缺點的話,就是不管你用不用,它就在那兒了,如果這個單例物件占用空間很大的話,同時只在特定場景才出現,就有點得不償失了這樣。

3.靜態內部類

餓漢式的缺點也很明顯,那就是即使不使用,也會存在,那麼能不能在它使用時才讓它new呢?可以啊,靜態內部類不就可以解決嘛。

/**

* 單例測試

*/public class singleton

//私有建構函式

private singleton()

public static singleton getsingleton()

}

既達到了懶漢式的效果,又執行緒安全。

4.列舉方式

/**

* 單例測試

*/public class singleton

}enum singletonenum

}

第一次看見這種方式時真的,真的被驚呆了,還能這麼玩。。。既是乙個例項,又能保證執行緒安全。。。另外還有乙個就是序列化問題,如果單例實現了序列化介面,那麼就不能保證是唯一例項了,但是列舉保證了能被自由序列化,這個原因我這邊不想過多**,知道一下,後續研究。這也是最推薦的方式。

4.雙重檢查機制

volatile為什麼運用在這邊

/**

* 單例測試

*/public class singleton

private static singleton getsingleton()}}

return singleton;

}}

一般餓漢式比較普遍,列舉的方式太冷僻了,但是我覺得確實最好的,看過之後決定以後都這麼寫。

雙重檢查感覺太囉嗦,但是其他沒什麼,面試的時候雙重檢查也是可以深究問下去很多東西。比如static,比如volatile,比如類載入,比如synchronized。

Java設計模式一 單例模式

1 餓漢式 在呼叫之前會首先例項化.優點 寫法簡單,避免了執行緒同步問題。缺點 在呼叫之前就會例項化,沒有達到lazy loading的效果。如果自始至終都沒有使用過這個實力,就會造成記憶體浪費。注意 1 載入順序,先靜態再動態,先屬性再方法,先上後下。2 構造方法要是私有化的,3 屬性要用fina...

JAVA設計模式(一)單例模式

單例類只能有乙個例項。單例類必須自己建立自己的唯一例項。單例類必須給所有其他物件提供這一例項。private static singleton instance private singleton public static singleton getinstance return instance...

JAVA 設計模式(一)單例模式

懶漢模式 public class singlelh public singlelh getinstance 餓漢模式 public class singlelh public singlelh getinstance 懶漢模式可以延遲載入,但是執行緒不安全,得加鎖 餓漢模式執行緒安全,但是不能延遲...