.課程網站
單例模式
????????單例模式,是一種常用的軟件設計模式糖声。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統(tǒng)中分瘦,應用該模式的類一個類只有一個實例蘸泻。即一個類只有一個對象實例。
1嘲玫、懶漢模式
優(yōu)點:單例在第一次使用時進行實例化創(chuàng)建悦施。
缺點:線程不安全,可能多個線程去創(chuàng)建多個實例去团。
2抡诞、懶漢+鎖模式
優(yōu)點:單例在第一次使用時進行實例化創(chuàng)建。
缺點:synchronized修飾方法土陪,只允許一個線程執(zhí)行getInstance()方法昼汗,影響了性能。
3鬼雀、餓漢模式
優(yōu)點:線程安全顷窒,類在加載時就實例化創(chuàng)建對象,沒有資源的競爭源哩。
缺點:
1鞋吉、當構造函數的處理較多時鸦做,類加載的時候會很慢,影響性能谓着。
2泼诱、如果這個類在后面不會被使用到,則導致資源的浪費漆魔。
4坷檩、雙重同步鎖模式
優(yōu)點:單例在第一次使用時進行實例化創(chuàng)建。
缺點:線程不安全改抡。 線程不安全原因:指令重排序
1矢炼、memory = allocate() 分配對象的內存空間
2、ctorInstance() 初始化對象
3阿纤、instance = memory 設置instance指向剛分配的內存?
JVM和CPU優(yōu)化句灌,發(fā)生指令重排:1->3->2?
因為2和3邏輯上沒有直接關系,可以發(fā)生指令重排欠拾。由于指令重排導致線程不安全的原因分析:當線程A進入同步鎖胰锌,開始創(chuàng)建對象時,執(zhí)行到3藐窄,給instance分配內存空間资昧,此時線程B過來獲取instance實例時,直接取到了這個并未初始化的實例荆忍, 導致后續(xù)使用這個未初始化的實例訪問時報錯格带。
5、雙重同步鎖+volatile
優(yōu)點:
1刹枉、單例在第一次使用時進行實例化創(chuàng)建叽唱。
2、線程安全
缺點:volatile修飾變量微宝,實現(xiàn)了多線程之間的數據可見性棺亭,但是影響了性能。
6蟋软、枚舉模式(推薦使用)
優(yōu)點:
1镶摘、線程安全:類似常量,在類加載時就初始化岳守,并且枚舉的私有構造方法只會被調用一次(第一次調用)钉稍,不會有資源競爭問題。
2棺耍、資源節(jié)約性:在類加載時只會初始化,不會實例化种樱,只有在第一次調用時實例化對象蒙袍,不會造成資源的浪費俊卤。