程序員小安卓 2021-09-20 00:17:44 阅读数:961
餓漢式顧名思義,就是這個漢子很餓,一上來就把單例對象創建出來了,要用的時候直接返回即可,這種是單例模式中最簡單的一種實現方式。但是問題也比較明顯。單例在還沒有使用到的時候,初始化就已經完成了。如果程序從頭到比特都沒用使用這個單例的話,單例的對象還是會創建,這就造成了不必要的資源浪費。
2.懶漢模式(線程不安全)[不可用]
優點:如果真實使用的情况下才會創建資源,如果沒人調用就可以省略創建的對象的步驟了
注意:
這種寫法起到了懶加載的效果,但只能在單線程下使用。如果在多線程下,一個線程進入了 if (instance == null) 判斷語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例。所以在多線程環境下不可使用這種方式。
—————————————————————————————————————————
[](
)餓漢模式和懶漢模式的線程安全問題
(一個線程)單線程是不存在線程安全的
首先要知道影響線程安全的五個因素:
a)搶占式
b)多個線程修改同一個變量
c)內存可見性
d)原子性
e)編譯器優化
而這裏面我們從原子性的角度去分析
1.餓漢模式
2.懶漢模式
2.1.懶漢模式(線程安全,但是不推薦使用)
————————————————————————————
2.2.懶漢模式(同步代碼塊,線程安全,但是不可用)
但是這種同步並不能起到線程同步的作用。假如一個線程進入了 if (instance == null) 判斷語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例。
2.3.懶漢模式雙重校驗鎖
雙檢索模式,進行了兩次判斷,第一次判斷時為了避免不要的實例,第二次是為了進行線程同步,避免多線程問題。
由於 new Singleton()創建對象的時候jvm中可能會重新排序,在多線程下存在風險,使用volatile關鍵字可以當線程改變其值後通知其他線程改變並且不會被jvm重新排序,解决該問題。
版权声明:本文为[程序員小安卓]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920001743891h.html