單例模式-懶漢式的一次多線程Debug
阿新 • • 發佈:2019-03-17
stat ron 打印 zed null 懶漢式 如果 要點 nbsp 將此線程執行到LazySingleton對象創建處。
塊中時,切換至
單例模式要要點就是一個類只會存在一個實例,要想達到這種效果,最重要的就是將構造方法設置為私有,然後通過static的方法來獲取對象。
上述設計並不線程安全,因為在lazySingleton = new LazySingletion()
這一步可能會發送線程的切換,導致出現多個lazySingletion對象。
可以通過多線程Debug來測試。
線程類:
測試類:
在多線程Debug時需要在斷點處勾選Thread
。
之後開始Debug。
開始時創建了兩個LazyThread線程對象。
可以看到目前有三個進程,Main
,Thread-0
,Thread-1
。
我們切換至Thread-0
此時lazySingleton還沒有實例化,為null,所以Thread-1
也可以通過if判斷進入其中。我們將Thread-1
線程也執行至此處。
接下來的順序就無所謂了,兩個線程都會去自己實例化lazySingleton對象。
執行完成後通過打印發現lazySingleton對象其實不是同一個。
如果我們正常運行呢?
可以發現大部分情況下都會時同一個lazySingleton對象。
為了保證線程安全性,可以通過synchronized
來修飾getInstance方法。
至於這種情況下的調試,在Thread-0
進入synchronized
Thread-1
會發現無法進入。單例模式-懶漢式的一次多線程Debug