單例模式的簡單實現與兩種實現方法的比較(餓漢式和懶漢式)(二)

單例模式的簡單實現與兩種實現方法的比較(餓漢式和懶漢式)(一)


餓漢式與懶漢式是單例模式的兩種不同的寫法,究竟使用哪個更爲方便和安全呢?

首先我們已經知道餓漢式是在外部類訪問該對象前,該對象就已經存在了,而懶漢式是等到有外部類訪問時才創建對象的。

我們可能會以爲使用懶漢式較爲方便且安全,因爲外部類訪問時才創建對象,不訪問就不創建對象。可是問題也來了:

先看一下懶漢式的實現方法:










我們都知道cpu在處理多個程序時,在非常短的時間內來回切換着執行各個程序的,所以當一個外部類A訪問getInstance()方法時有可能會被cpu暫時終止執行,而改去執行其他的程序,如果cpu 在程序A訪問到第39行“if(single == null)"時終止執行,而改去執行B程序,而剛好B程序也在訪問getInstance()方法,那麼程序B在訪問時必定創建一個Single對象,而此時cpu再改去執行A程序,A程序也會創建一個Single對象,這時就會出現了錯誤。

有錯誤就得解決啊,那該如何解決呢?

這裏使用java多線程中的關鍵字synchronized,因爲當使用它來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻只有一個線程訪問該程序。

代碼如下:


這樣當多程序執行時,也就不存在安全的問題了,只是這時,如果這樣使用該懶漢式就會使代碼變得繁瑣起來,而餓漢式是既方便又安全的單例模式實現方法。所以原則上是建議使用餓漢式單例模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章