ホームページ  >  記事  >  バックエンド開発  >  C#でのマルチスレッドオブジェクト作成の共有例

C#でのマルチスレッドオブジェクト作成の共有例

黄舟
黄舟オリジナル
2017-07-27 16:16:341589ブラウズ

この記事のタイトルは、シングルトンモードでブログを書いているときに遭遇した問題なので、簡単にマルチスレッドの使い方を覚えるために今日デモを書きました。

私が苦労しているのは、ロックせずにシングルトンモードで複数のインスタンスオブジェクトのエラーを再現するために、forループでオブジェクトを複数回インスタンス化する方法です。

まず、私が単純に実装したマルチスレッド インスタンス オブジェクトを示します。

オプション 1:

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();

の出力:

2つのオブジェクトを出力さまざまな参照を使用して、私が望むものを達成します。

でも、forループを使って複数のスレッドでインスタンスを作成する方法は昔からあったのですが、思い出せなくて、今日情報チェックをしていたときに偶然この方法を見つけてしまいました。それをすぐに書き留めて、夜残業して頭の中に印象を残すために書きました。

オプション 2:

Program.cs


                for (int i = 0; i < 2; i++)
                {                    
                new Action(() => { Demo.GetInstance(); }).BeginInvoke(null, null);
                }
                Console.Read();

出力:このようなシングルをバグらせます。サンプルモードでは、ロック解除された間違った状態を再現できます、私の疑問も解決され、for ループでのマルチスレッドインスタンス作成の問題を解決する方法も見つかりました。

以上がC#でのマルチスレッドオブジェクト作成の共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。