Maison  >  Article  >  développement back-end  >  Exemple de partage de création d'objets multithread en c#

Exemple de partage de création d'objets multithread en c#

黄舟
黄舟original
2017-07-27 16:16:341543parcourir

Le titre de cet article concerne les problèmes que j'ai rencontrés lors de la rédaction d'un blog en mode singleton, j'ai donc écrit une démo aujourd'hui pour m'aider à me rappeler comment utiliser le multi-threading simplement.

Ce avec quoi j'ai du mal, c'est comment instancier l'objet plusieurs fois dans la boucle for, afin de reproduire l'erreur de plusieurs objets d'instance en mode singleton sans verrouillage.

Permettez-moi d'abord de vous montrer l'objet instance multithread que j'ai simplement implémenté.

Option 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, code client


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

Sortie :

Sortir deux objets avec des références différentes, réalisant ce que je veux.

Mais dans mon esprit, il y a toujours eu un moyen pour la boucle for de créer des instances dans plusieurs threads, mais je ne m'en souviens tout simplement pas, j'ai accidentellement vu cela quand j'étais. Je vérifie les informations aujourd'hui. J'écrirai la méthode immédiatement, puis je ferai des heures supplémentaires la nuit pour l'écrire, afin de pouvoir avoir une impression dans mon esprit.

Option 2 :

Program.cs


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

Sortie :

Cela peut être reproduit lors du débogage du mode singleton L'erreur déverrouillée a été résolu et mes doutes ont été résolus. J'ai trouvé un moyen de résoudre le problème de la création d'instances multithread dans une boucle for.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn