確保乙個類只有乙個例項,並提供乙個全域性訪問點
一般分類兩大類:餓漢模式、懶漢模式
/*** 餓漢模式, 執行緒安全, 但預設就建立例項, 占用空間 */
public
class
singleton1
public
static
singleton1 getintance()
}
用空間換時間,預設就建立例項,所以沒有執行緒安全問題
/*** 懶漢模式, 執行緒不安全 */
public
class
singleton2
public
static
singleton2 getinstance()
return
instance;
}}
現在不安全在於,多個執行緒訪問getinstance()時,當乙個執行緒已經初始化了,而另外乙個執行緒並沒有感知,又重新建立了例項,這時候就不是單例
/*** 懶漢模式--雙檢索 */
public
class
singletondoublecheck
public
static
singletondoublecheck getinstance() }}
return
instance;
}}
為了在懶漢模式的基礎上,保證執行緒安全, 出現了雙檢鎖的設計,但是有出現了另乙個問題。
在new singletondoublecheck()時,是非原子性的,實際分為三步
new 分配記憶體空間
初始化物件
將物件指向剛分配的記憶體空間
但jvm編譯器,為了效能考慮,可能重新排序2,3兩個, 變為:
new 分配記憶體空間
將物件指向剛分配的記憶體空間
初始化物件
舉例說明:
執行緒1檢查到instance為空,獲取鎖,再次檢查instance為空,為instance分配記憶體空間,指向記憶體空間,這時執行緒2檢查到instance不為空,直接返回instance,但此時物件還沒有初始化完成
/*** 使用volatile關鍵字的雙檢鎖 */
public
class
singletondoublecheck2
public
static
singletondoublecheck2 getinstance() }}
return
instance;
}}
使用volatile關鍵字來禁止jvm重排序
/*** 靜態內部類實現 -- 延遲載入
* * 天生執行緒安全 */
public
class
singleton3
/*** 靜態內部類
*/private
static
class
innerobject
public
static
singleton3 getinstance()
public
static
void
main(string args)
}
/*** 懶漢模式 -- 靜態**塊實現 */
public
class
singleton4
public
static
singleton4 getinstance()
}
外部類載入時並不需要立即載入內部類,所以可以起到延時載入的目錄,
三、總結
單例模式是乙個建立型的設計模式,能夠幫助開發者建立乙個唯一的例項
使用的還是挺頻繁的
單例模式示例 以示例為例
單例模式示例 存檔日期 2019年5月13日 首次發布 2003年2月1日 從sax到rddl,社群標準在xml技術中起著非常重要的作用。xslt最重要的社群標準是exslt倡議,用於標準擴充套件功能和元素。在本文中,uche ogbuji使用實際示例來介紹和演示一些有用的exslt函式。此內容不再...
單例模式理解
單例模式 三要素 1 私有的構造方法 2 私有的靜態的例項物件 3 公共的靜態的提供訪問方法 根據單例模式的建立時機可以將其分為兩種型別 1 懶漢模式 在系統初始化時不會做初始化,會在什麼時候使用到時做初始化操作。public class ehanmoshi private static lanha...
單例模式理解
摘要 本文首先概述了單例模式產生動機,揭示了單例模式的本質和應用場景。緊接著,我們給出了單例模式在單執行緒環境下的兩種經典實現 餓漢式 和懶漢式,但是餓漢式是執行緒安全的,而懶漢式是非執行緒安全的。在多執行緒環境下,我們特別介紹了五種方式來在多執行緒環境下建立執行緒安全的單例,即分別使用synchr...