U3D——單例模式的用法
阿新 • • 發佈:2020-07-30
單例模式
老生常談的單例模式是那麼的簡單,但在框架設計中又是那麼的重要,現在和大家一起討論一下單例模式。
特點:
一、私有的建構函式(私有)
二、私有靜態的全域性變數
三、公有的靜態對外介面
作用:
確保程式建立唯一變數
避免頻繁的建立銷燬物件,提高效能
避免對共享資源的多重佔用,簡化訪問
為整個系統提供一個全域性訪問點
簡單瞭解單例模式中的各種模式
1、懶漢模式
為什麼叫懶漢模式呢,我覺得哈,因為這種型別是來一個new一個,所有感覺上比較懶(這純屬瞎逼逼,哈哈哈),上程式碼
public class Singletion { private staticSingletion instence; private Singletion() { } public static Singletion GetInstence() { if (instence ==null ) { instence = new Singletion(); } return instence; } }
大家都在說懶漢模式下的多執行緒是不安全的單例模式,那為啥不安全呢,不安全在哪呢呢,下面給大家圖解一下
圖解:現在有兩個執行緒需要new同一個物件,當執行緒1執行到if(instence==null)後暫停,此時物件還未建立,執行緒2超過執行緒1直接new完物件後,此時If(instence==null)才生效,但此時執行緒1已經在if之中了,於是就會new兩個相同的物件出來,綜上所述,多執行緒下的懶漢式的單例模式是不安全的。
安全的懶漢模式
public class LockSingletion { private volatile static LockSingletion instance = null; private static readonly object _lock = new object(); private LockSingletion() { } public static LockSingletion GetInstance() { if (instance ==null ) { lock (_lock) {if (instance ==null ) { instance = new LockSingletion(); } } } return instance; } }
為什麼加個lock這個單例模式就安全了呢,現在我們來看一下Lock的定義
定義:lock 確保當一個執行緒位於程式碼的臨界區時,另一個執行緒不進入臨界區。如果其他執行緒試圖進入鎖定的程式碼,則它將一直等待(即被阻止),直到該物件被釋放
2、餓漢模式
public class HungrySingletion { private static HungrySingletion instance = new HungrySingletion(); private HungrySingletion() { } public static HungrySingletion getInstence() { return instance; } }
安全性:在類載入時會將進行載入,等到呼叫時該類已經被處理好了所以能保證多執行緒呼叫下,呼叫的是同一個例項。
想知道安全性是怎麼測試出來的,請點選這
在U3D中的用法
單例模式在U3D中一般用做搭建管理類框架,如下圖
程式碼後期奉上