談到單例模式,首先需要說明一下,單例模式(Singleton Pattern)是JAVA中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式。保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
要實現一個線程安全的單例模式有多種做法。常見的有懶漢式、餓漢式、雙檢鎖/雙重校驗鎖、靜態內部類、枚舉等方式。每種方式都有優缺點,並不偏向某一種創建方式。具體情況具體分析,然後採用比較好的創建方式纔是最明智的選擇。
在這裏我採用雙檢鎖/雙重校驗鎖方式來創建一個線程安全的單例模式。
package com.singleton;
import java.util.Arrays;
/**
* 線程安全的單例模式
* 雙檢鎖/雙重校驗鎖,volatile關鍵字一定要加,不然在會存在多線程併發時候可能返回半初始化對象
* 詳情可以在我的頭條號 ‘小輝GE’ 查看對應單例模式視頻,裏面有詳細講解
*
* @author 小輝GE/小輝哥
* <p>
* 2019年8月7日 下午21:30:00
*/
public class Singleton {
private static volatile Singleton single = null;
private Singleton() {
}
public static Singleton getInstance() {
if (single == null) {
synchronized (Singleton.class) {
if (single == null) {
single = new Singleton();
}
}
}
return single;
}
public static void main(String[] args) {
Thread[] th = new Thread[100];
for (int i = 0; i < th.length; i++) {
th[i] = new Thread(() -> {
System.out.println(Singleton.getInstance().hashCode());
});
}
Arrays.asList(th).forEach(o -> o.start());
}
}
測試輸出結果如下(輸出結果比較多,我們只截取部分):
關於雙檢鎖/雙重校驗鎖創建方式爲什麼需要volatile,詳情可以在我的頭條號‘小輝GE’查看對應單例模式視頻,裏面有詳細講解
以上代碼僅供參考,如有不當之處,歡迎指出!!!
更多幹貨,歡迎大家關注和聯繫我。期待和大家一起更好的交流、探討技術!!!