首頁  >  文章  >  後端開發  >  c#中關於多執行緒建立物件的範例分享

c#中關於多執行緒建立物件的範例分享

黄舟
黄舟原創
2017-07-27 16:16:341583瀏覽

這次的標題是我在寫單例模式的部落格時遇到的問題,所以今天專門寫了的demo讓自己記住怎麼簡單的使用多線程。

一直糾結的是怎麼在for循環中多次實例化對象,好復現單例模式在沒有加鎖的情況下出現多個實例對象的錯誤。

先給大家看一下我簡單實作的多執行緒實例物件。

方案一:

#Demo.cs


    public class Demo
    {        private static Demo _demo = null;        /// <summary>
        /// 构造函数        /// </summary>
        private Demo()
        {
            Console.WriteLine("构造了{0}", GetType().Name);
        }        /// <summary>
        /// 获取该类的唯一实例        /// </summary>
        /// <returns>该类的唯一实例</returns>
        public static Demo GetInstance()
        {            if (_demo == null)
                _demo = new Demo();            return _demo;
        }
    }

Program.cs,客戶端程式碼


#
                Demo d1 = null;
                Demo d2 = null;                //多线程创建对象实例
                var t1 = new Thread(() => { d1 = Demo.GetInstance(); });                
                var t2 = new Thread(() => { d2 = Demo.GetInstance(); });

                t1.Start();
                t2.Start();
                Thread.Sleep(1000);//主线程等待子线程执行完成,为d1和d2变量赋值
                Console.WriteLine("d1 == d2 {0}", object.ReferenceEquals(d1, d2));
                Console.Read();

#輸出:

輸出兩個不一樣引用的對象,達到了我想要的目的。

但在我的腦海中,一直有個關於for迴圈可以多執行緒建立實例的方法,就是想不起來,今天在查資料的時候無意中看到了這種方法,我就立刻記下來,然後晚上加個班寫出來,這樣在腦中有個印象。

 

方案二:

#Program.cs

 

######
                for (int i = 0; i < 2; i++)
                {                    
                new Action(() => { Demo.GetInstance(); }).BeginInvoke(null, null);
                }
                Console.Read();
#######輸出:######################這樣調試單例模式的時候就可以復現未加鎖的錯誤了,也解決了我心頭的疑問,找到了解決for迴圈中多執行緒建立實例的方法。 #########  ####

以上是c#中關於多執行緒建立物件的範例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn