1. 程式人生 > 實用技巧 >U3D——單例模式的用法

U3D——單例模式的用法

單例模式

老生常談的單例模式是那麼的簡單,但在框架設計中又是那麼的重要,現在和大家一起討論一下單例模式。

特點:

一、私有的建構函式(私有)

二、私有靜態的全域性變數

三、公有的靜態對外介面

作用:

確保程式建立唯一變數

避免頻繁的建立銷燬物件,提高效能

避免對共享資源的多重佔用,簡化訪問

為整個系統提供一個全域性訪問點

簡單瞭解單例模式中的各種模式

1、懶漢模式

為什麼叫懶漢模式呢,我覺得哈,因為這種型別是來一個new一個,所有感覺上比較懶(這純屬瞎逼逼,哈哈哈),上程式碼

public class Singletion
{
    private static
Singletion 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中一般用做搭建管理類框架,如下圖

程式碼後期奉上