1. 最簡單的單例模式:
package com.example.demo.juc.thread;
/** * @author huapeng.zhang
* @version 1.0
* @date 2020/9/17 18:28
*/public class singletomdemo
private static singletomdemo getinstance()
return singletomdemo;
}public static void main(string args)
}
在單執行緒的情況下,列印結果如下:
可以看到,雖然我們一共呼叫了六次getinstance()
, 但是只列印了一次構造方法輸出內容,也就是只呼叫了乙個建構函式,所獲得的物件位址自然是一樣的。
2. 多執行緒下的單例模式
我們對main()
方法做一下改造,改造後的**如下:
public static void main(string args) , string.valueof(i)).start();}}
列印結果為:
多次執行下可以看到列印的次數是不同的。
可以對getinstance()
方法新增synchronized
加鎖,保證只生成乙個例項。
private static synchronized singletomdemo getinstance()
return singletomdemo;
}
再次執行程式發現只列印了一次構造方法輸出函式,還有另外一種方法就是dcl:double check locks雙端檢測模式
模式也可以達到同樣的目的。
3.dcl + 單例模式
我們再次對getinstance()
方法進行改造,**如下:
// dcl模式(double check locks雙端檢測模式)
private static singletomdemo getinstance() }}
return singletomdemo;
}
當我們的單例模式寫到這種程度的時候,基本可以應對99%的情況,但是由於指令排序
的存在,還是有可能會出現問題。
4.volatile + 單例模式
我們在宣告singletomdemo
時,加上volatile
關鍵字修飾,就可以達到完美的效果。
最終**:
package com.example.demo.juc.thread;
/** * @author huapeng.zhang
* @version 1.0
* @date 2020/9/17 18:28
*/public class singletomdemo
// dcl模式(double check locks雙端檢測模式)
private static singletomdemo getinstance() }}
return singletomdemo;
}public static void main(string args) , string.valueof(i)).start();}}
}
如何設計乙個單例模式
單例類最簡單的c 實現 class single single static single getinstance return m pinstance single single m pinstance null 單例要求 參考 劍指offer c 保證執行緒安全 class single ret...
springboot 單例 如何實現乙個單例及優化
社長,乙個愛學習,愛分享的程式猿,始終相信,付出總會有回報的。知識改變命運,學習成就未來。愛拼才會贏 star https github.com itfqyd cxyxs面試官隔壁小王 自我介紹一下 社長 面試官,您好!我叫社長 面試官隔壁小王 你說說如何實現乙個單例?都有幾種實現方式 社長 我知道...
如何寫出乙個好的單例模式
單例模式是設計模式中總容易理解,並且使用次數比較多的模式,往往在面試中會被問到。在這裡我簡述下自己的思路。希望能對你有所幫助。懶漢式 單例模式 public class single public static single getinstance return instance 複製 上面這種,是...