이 글의 제목은 제가 싱글톤 모드로 블로그를 작성할 때 겪었던 문제로, 멀티스레딩을 간단하게 사용하는 방법을 기억할 수 있도록 오늘 데모를 작성했습니다.
제가 고민했던 것은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!