iT邦幫忙

0

c# 新手 求問單例寫法

c#
  • 分享至 

  • xImage

一片模糊不懂

class singleton
{
    private static singleton _singleton;
    private static object obj = new object();

    private singleton()
    {
    }

    public static singleton getSingleton()
    {
        if (_singleton == null)
        {
            lock (obj)
            {
                if (_singleton == null)
                {
                    _singleton = new singleton();
                }

            }
        }

        return _singleton;
    }
}

為什麼要這樣寫?

jakeuj iT邦新手 5 級 ‧ 2019-01-25 15:57:28 檢舉
http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/
Jason iT邦新手 4 級 ‧ 2021-08-25 10:49:39 檢舉
我也完全看不懂,後來找了一堆說明,終於了解了百分之1,簡單的程式搞成這樣難懂c#好棒棒
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
暐翰
iT邦大師 1 級 ‧ 2018-03-17 11:28:08

概念:

單例要求不能實例化能直接取得,多線程時也要保持唯一性


接著要理解單例,可以先從最簡單用法

public static readonly singleton Instance = new singleton();

使用static readonly達到唯一跟實體化跟不能clone
這樣不管誰使用Instance都可以"取到同一個物件"


接著來理解你的CODE
1.使用static,但是缺少了readonly所以可以被修改,滿足不了第三點需求

2.private + 不建立set方法 + 只建立getSingleton方法用來替代readonly
-
2.1 為什麼要判斷兩次_singleton==null

因為lock在最外層,每一次呼叫方法都要鎖住Thread這成本太高了
所以只在_singleton=null的時候才去lock
2.2 obj物件單純用來lock確保只有當前執行緒執行該區段

2.3 為什麼裡面還要包一個null判斷
因為外層的if判斷,會有多線程被修改問題,所以才要在裡面多包一層

Jason iT邦新手 4 級 ‧ 2021-08-25 10:58:01 檢舉

大師我想他應該和我一樣,想了解的是一般基本這幾行的原理,還要為什要這樣做,目地是什麼,就像肚子餓要吃飯,(一片模糊不懂)已很清楚說明他的問題,說實話我一開始看也完全不種,只知道他是用來Tools.Instance().xx, 因為別人程寫好已經是這樣用,但你會好奇他的來源程式碼,但一看像是無字天書,但好玩的是很多說明雖然是中文但還是像文言文一樣。我找了一堆說明終於弄懂1%,他應該就是以前經典asp裏面的Application 物件, 但以前asp 真的好學易懂,現在這個把簡單事搞的很麻煩

我要發表回答

立即登入回答