單例模式要要點就是乙個類只會存在乙個例項,要想達到這種效果,最重要的就是將構造方法設定為私有,然後通過static的方法來獲取物件。
上述設計並不執行緒安全,因為在lazysingleton = new lazysingletion()
這一步可能會傳送執行緒的切換,導致出現多個lazysingletion物件。
可以通過多執行緒debug來測試。
執行緒類:
測試類:
在多執行緒debug時需要在斷點處勾選thread
。
之後開始debug。
開始時建立了兩個lazythread執行緒物件。
可以看到目前有三個程序,main
,thread-0
,thread-1
。
我們切換至thread-0
將此執行緒執行到lazysingleton物件建立處。
此時lazysingleton還沒有例項化,為null,所以thread-1
也可以通過if判斷進入其中。我們將thread-1
執行緒也執行至此處。
接下來的順序就無所謂了,兩個執行緒都會去自己例項化lazysingleton物件。
執行完成後通過列印發現lazysingleton物件其實不是同乙個。
如果我們正常執行呢?
可以發現大部分情況下都會時同乙個lazysingleton物件。
為了保證執行緒安全性,可以通過synchronized
來修飾getinstance方法。
至於這種情況下的除錯,在thread-0
進入synchronized
塊中時,切換至thread-1
會發現無法進入。
posted @
2019-03-17 19:39
antzuhl 閱讀(
...)
編輯收藏
設計模式 單例模式之懶漢式 多執行緒
package cn.itcast 03 單例模式 餓漢式 類一載入就建立物件 懶漢式 用的時候,才去建立物件 面試題 單例模式的思想是什麼?請寫乙個 體現。開發 餓漢式 是不會出問題的單例模式 面試 懶漢式 可能會出問題的單例模式 思想 a 懶載入 延遲載入 用的時候才去載入 b 執行緒安全問題 ...
多執行緒 單例模式之懶漢
1.懶漢 延遲載入 2.正確 3.效率還比較高 通過 1.volatile 的引入,目的解決 ins new 重排序帶來的問題 2.synchronized 的引入,目的是解決原子性問題 3.見方法注釋 public class lazysingleton3 乙個獲得 ins 的方法 public ...
單例模式的懶漢式在多執行緒的問題
我們都知道,單例設計模式中有兩種方法,一種是餓漢式,另外一種就是懶漢式,具體如下 餓漢式 package com.seven.exercise.testeception 單例模式,餓漢式 author seven public class singledemohunger private stati...