支持多并发的单例有哪几种写法
生活随笔
收集整理的這篇文章主要介紹了
支持多并发的单例有哪几种写法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.什么是單例以及單例的使用場景就不多說了,不清楚的可以看我上篇文章或者自行查找
二.單例和多并發之間的規則
? ? ?單例就是只能創建一個實例對象,而多并發情況下如果不處理一下單例的寫法很難保證只創建一個實例對象,所以后面會出問題
? ? ?處理的思路:在創建對象的時候使用同步鎖,或者直接懶人做法---放一個靜態的實例對象
三.幾種常見的單例模式的寫法
? ? 1.最常規的(線程不安全--不支持多并發)
public class Singleton {//一個靜態的實例private static Singleton singleton;//私有化構造函數private Singleton(){}//給出一個公共的靜態方法返回一個單一實例public static Singleton getInstance(){if (singleton == null) {singleton = new Singleton();}return singleton;}? ?2.上面的常用的是不支持并發的,所以后面考慮在方法上加同步鎖,但是如果在上面那個獲取對象的方法上加鎖則會每次在獲取對象時都需要等待,蠻費時間的,所以不能這么玩,
? ? ? ?可以使用如下方法內部類寫法(其實我感覺他和餓漢式差不多,都是new一個靜態實例放在那里)
public class Singleton {/* 私有構造方法,防止被實例化 */private Singleton() {}/* 此處使用一個內部類來維護單例 */private static class SingletonFactory {private static Singleton instance = new Singleton();}/* 獲取實例 */public static Singleton getInstance() {return SingletonFactory.instance;}} 備注: 第一次調用getInstance的時候,JVM能夠幫我們保證instance只被創建一次,并且會保證把賦值給instance的內存初始化完畢,因為JVM內部的機制能夠保證當一個類被加載的時候,這個類的加載過程是線程互斥的可以對比一下餓漢式寫法: public class Singleton {private static Singleton instance = new Singleton();private Singleton() { }public static Singleton getInstance() {return instance; } }?
? ? 3.或者在創建類的那個時刻同步就行,獲取對象的方法就不同步(和懶漢式類似,需要時加載就行)
public class SingletonTest {private static SingletonTest instance = null;private SingletonTest() {}private static synchronized void syncInit() {if (instance == null) {instance = new SingletonTest();}}public static SingletonTest getInstance() {if (instance == null) {syncInit();}return instance;} }懶漢式的不高效寫法,相當于也是同步了獲取對象的方法 public class Singleton { private static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance(){ if (instance == null) { instance = new Singleton(); } return instance; } }?
? 4.所謂的雙重鎖寫法(相當于變相的在類的創建時加同步鎖,和方法三原理類似或者和方法二內部類利用jvm類加載機制類似)
public class Singleton{private volatile static Singleton singleton;private Singleton(){}public static Singleton getSingleton(){if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;} }?
轉載于:https://www.cnblogs.com/feichen-66/p/11195818.html
總結
以上是生活随笔為你收集整理的支持多并发的单例有哪几种写法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏脚本代码大全_按键精灵】一个很好学的
- 下一篇: x79服务器主板装系统,【小白经历分享】