写一个线程安全的单例模式
生活随笔
收集整理的這篇文章主要介紹了
写一个线程安全的单例模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫一個線程安全的單例模式
目錄
- 寫一個線程安全的單例模式
- 1、餓漢式
- 2、懶漢式
- 3、使用雙重校驗 + volatile
- 4、枚舉單例
- 5、Lock
- 6、AtomicReference + CAS
線程安全的單例模式有很多種寫法:
1、餓漢式
我們以jdk源碼為例,Runtime類的源碼:
類加載為靜態變量賦值。
2、懶漢式
synchronized修飾靜態方法。
public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}}3、使用雙重校驗 + volatile
synchronized修飾代碼塊,volatile可見性。
public class Singleton {private static volatile Singleton instance = null;private Singleton() {}public static Singleton getInstance() {if (instance == null) { // 先判斷實例是否存在,不存在再加鎖synchronized (Singleton.class) {if (instance == null) { // 多線程情況下,只有一個能進入,避免創建多個對象。return instance = new Singleton();}}}return instance;}}4、枚舉單例
一個枚舉就是一個單例。
enum SingletonEnum {INSTANCE; }5、Lock
public class Singleton {private static Singleton instance;private static final Lock lock = new ReentrantLock();private Singleton() { }public static Singleton getInstance() {lock.lock();try {if (instance == null) {instance = new Singleton();}return instance;} finally {lock.unlock();}}}6、AtomicReference + CAS
public class Singleton {private static final AtomicReference<Singleton> instance = new AtomicReference<Singleton>();private Singleton() { }public static Singleton getInstance() {for (;;) {Singleton singleton = instance.get();if (null != singleton) {return singleton;}singleton = new Singleton();if (instance.compareAndSet(null, singleton)) {return singleton;}}}}總結
以上是生活随笔為你收集整理的写一个线程安全的单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。