設計模式之單例模式讀後思考,設計模式讀後
上篇:我複習了6大原則, 睡覺前還想了一陣子, 我分析了一下, 想要牢記這些原則, 就必須動手寫一些項目
學習地址 http://www.cnblogs.com/zuoxiaolong/p/pattern2.html
我記得我學習6大原則看了一個月, 這次這個單例模式 只看了4天, 有一點推動力感覺還是可以的
我自己的理解:
單例模式,原文: 指的是一個類在整個應用中, 有且只有一種狀態.
本人理解: 類只有一個, 所有調用者拿到的都是這個類, 調用者的修改是阻塞的, 調用者的查詢是非阻塞的,
單例模的應用情境基本都是在是可變共用
原文中有個讓cpu飆升的測試單例的方法, TestSinglenton 這個測試方法 ,主要問題出在lock這個變數上, 在前面加上volatile這個變數, 保證可見度,
其實加了volatile cpu也會飆升, 但是結果可以及時列印出來
但是沒加的話結果卡住,原因是什麼,lock這個變數沒有了可見度, 我推斷lock.isLock()一直拿的是false, 所有的子線程一直沒有擷取到新的lock導致一直在迴圈
這時我就有個疑問了, 理論上在主線程我們改變lock的值, 但是這裡顯然, 子線程依然沒有擷取到我們想要的那個值, 難道說, lock之前的值依然沒有被gc掉
我加了一小段代碼檢驗的一番
while (true) {System.out.println("----"+lock.isLock()+"1------");System.out.println("----"+lock.isLock()+"2------");System.out.println("----"+lock.isLock()+"3------");.....}
結果,很震驚, 同一個線程下取到的lock值居然不一樣, 並且 lock1總是初始值 lock3的數量>lock2, 這裡感覺像 線程看著lock的值從true變成false
這5列代表5個線程
一個漸漸層化的過程, 等看完jvm再詳細分析一波, 實際上是不是這樣的呢?
終於, 我在java並發實戰中找到了這個答案,
但是在實際的我還是發現的一個問題, 如果我沒有列印這個lock, 那麼lock.isLock始終拿的是true, 一直在迴圈