Unity闪盔、C#單例模式

microsoft文檔:https://docs.microsoft.com/zh-cn/previous-versions/msp-n-p/ff650316(v=pandp.10)

參考:https://blog.csdn.net/yupu56/article/details/53668688

文檔:
lock:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/lock-statement
volatile:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/volatile#example

一. 基本

基礎(chǔ)代碼

public sealed class Singleton 
{ 
   private Singleton (){}
   //使用volatile防止某線程讀取到instance不為null時弯院,instance引用的對象有可能還沒有完成初始化(另一線程中還沒有完成寫入操作)。
   private static volatile Singleton instance; 
   private static object syncRoot = new Object(); 
   public static Singleton Instance 
   { 
      get  
      { 
         //此處加一個if進行優(yōu)化泪掀。是因為只有在第一次創(chuàng)建對象的時候需要加鎖听绳。
         if (instance == null)
         { 
            lock (syncRoot)  //如果沒有這個,不同的執(zhí)行線程同時進入Instance屬性方法,則可能會創(chuàng)建多個Singleton對象的實例
            { 
               if (instance == null)  
                  instance = new Singleton(); 
            } 
         } 
         return instance; 
      } 
   } 
}
lock 關(guān)鍵字:
  • 獲取給定對象的互斥 lock异赫。執(zhí)行語句塊椅挣,然后在釋放 lock头岔。
  • 持有 lock 時,持有 lock 的線程可以再次獲取并釋放 lock鼠证。
  • 阻止任何其他線程獲取 lock 并等待釋放 lock切油。
volatile關(guān)鍵字:
  • 背景:
    • 出于性能原因,編譯器名惩,運行時系統(tǒng)甚至硬件都可能對存儲器位置的讀取和寫入兩種操作重新排列澎胡,也就是說一個字段可以由多個線程同時執(zhí)行讀寫。
    • 多個線程同時訪問一個變量娩鹉,CLR為了效率攻谁,允許每個線程進行本地緩存,這就導致了變量的不一致性弯予。
  • 作用:申明了volatile的字段不進行讀寫操作重新排列的優(yōu)化戚宦。不允許線程進行本地緩存,每個線程的讀寫都是直接操作在共享內(nèi)存上锈嫩,這就保證了變量始終具有一致性受楼。

二. 單例模式父類

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace DW
{
    public class SingletonParent<T> where T : class, new()
    {
        protected SingletonParent() { }
        private static volatile T instance;
        private static readonly object syncRoot = new object();
        public static T Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                        {
                            instance = new T();
                        }
                    }
                }
                return instance;
            }
        }
    }
}

三. 關(guān)于繼承MonoBehaviour

  • 加載腳本實例時會調(diào)用Awake
  • 在初始化所有對象之后才調(diào)用Awake
  • 所以,此時已經(jīng)被實例化呼寸,用this將當前實例對象給instance
private void Awake()
{
      if(mMyInstance == null)
      {
          mMyInstance = this;
      }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艳汽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子对雪,更是在濱河造成了極大的恐慌河狐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑟捣,死亡現(xiàn)場離奇詭異馋艺,居然都是意外死亡,警方通過查閱死者的電腦和手機迈套,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門捐祠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桑李,你說我怎么就攤上這事踱蛀。” “怎么了芙扎?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵星岗,是天一觀的道長。 經(jīng)常有香客問我戒洼,道長俏橘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任圈浇,我火速辦了婚禮寥掐,結(jié)果婚禮上靴寂,老公的妹妹穿的比我還像新娘。我一直安慰自己召耘,他們只是感情好百炬,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著污它,像睡著了一般剖踊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衫贬,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天德澈,我揣著相機與錄音,去河邊找鬼固惯。 笑死梆造,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的葬毫。 我是一名探鬼主播镇辉,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贴捡!你這毒婦竟也來了忽肛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤栈暇,失蹤者是張志新(化名)和其女友劉穎麻裁,沒想到半個月后箍镜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體源祈,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年色迂,在試婚紗的時候發(fā)現(xiàn)自己被綠了香缺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡歇僧,死狀恐怖图张,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诈悍,我是刑警寧澤祸轮,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站侥钳,受9級特大地震影響适袜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舷夺,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一苦酱、第九天 我趴在偏房一處隱蔽的房頂上張望售貌。 院中可真熱鬧,春花似錦疫萤、人聲如沸颂跨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恒削。三九已至,卻和暖如春尾序,著一層夾襖步出監(jiān)牢的瞬間蔓同,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工蹲诀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斑粱,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓脯爪,卻偏偏與公主長得像则北,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痕慢,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 單例模式是設(shè)計模式中很常用的一種模式尚揣,它的目的是讓一個類在程序運行期間有且只有一個實例。關(guān)于 Unity 中如何實...
    HJDaryl閱讀 31,502評論 3 36
  • 為什么使用單例模式 單例模式的效果是系統(tǒng)中對應(yīng)類只有一個實例對象掖举,根據(jù)不同的場景原因各有不同快骗,有的是為了避免多次創(chuàng)...
    白樺葉閱讀 849評論 0 0
  • 單例模式(Singleton Pattern) 是最簡單的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式塔次,它提供了...
    passiony閱讀 11,295評論 1 5
  • 一個簡單的單例示例 單例模式可能是大家經(jīng)常接觸和使用的一個設(shè)計模式方篮,你可能會這么寫 publicclassUnsa...
    Martin說閱讀 2,236評論 0 6
  • C#新功能 一、C#歷史演變 C# 1励负,Visual Studio .NET 2002: C# 初版藕溅。 C# 1....
    165e0c0b59d2閱讀 2,556評論 0 3