單例模式之雙檢鎖/雙重校驗鎖

談到單例模式,首先需要說明一下,單例模式(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’查看對應單例模式視頻,裏面有詳細講解

以上代碼僅供參考,如有不當之處,歡迎指出!!!

更多幹貨,歡迎大家關注和聯繫我。期待和大家一起更好的交流、探討技術!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章