>백엔드 개발 >C#.Net 튜토리얼 >C#에서 멀티스레드 객체 생성에 대한 공유 예

C#에서 멀티스레드 객체 생성에 대한 공유 예

黄舟
黄舟원래의
2017-07-27 16:16:341638검색

이 글의 제목은 제가 싱글톤 모드로 블로그를 작성할 때 겪었던 문제로, 멀티스레딩을 간단하게 사용하는 방법을 기억할 수 있도록 오늘 데모를 작성했습니다.

제가 고민했던 것은 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();

출력:

두 개의 객체 출력 다른 참조를 통해 내가 원하는 것을 달성했습니다.

근데 내 마음속에는 항상 for 루프를 사용하여 여러 스레드에서 인스턴스를 생성하는 방법이 있었는데, 오늘 정보를 확인하다가 우연히 이 방법을 봤는지 기억이 나지 않았다. 그 다음에는 밤에 야근을 해서 마음에 남을 수 있도록 적었습니다.

옵션 2:

Program.cs


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

출력:

디버깅 이렇게 싱글을 예시 모드에서는 잠금해제된 Wrong을 재현할 수 있습니다. , 이는 또한 내 의심을 해결하고 for 루프에서 다중 스레드 인스턴스 생성 문제를 해결하는 방법을 찾았습니다.

위 내용은 C#에서 멀티스레드 객체 생성에 대한 공유 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.