1. 程式人生 > >單例模式-懶漢式的一次多線程Debug

單例模式-懶漢式的一次多線程Debug

stat ron 打印 zed null 懶漢式 如果 要點 nbsp

單例模式要要點就是一個類只會存在一個實例,要想達到這種效果,最重要的就是將構造方法設置為私有,然後通過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會發現無法進入。

單例模式-懶漢式的一次多線程Debug