如何實現乙個優秀的單例模式

2021-10-10 00:16:36 字數 1922 閱讀 8609

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 複製 上面這種,是...