첫째, 디자인 모드에서 싱글턴 모드를 사용하여 객체의 다중 초기화로 인해 접근 공간의 불일치가 발생하는 것을 방지합니다.
계산의 정확성을 보장하기 위해 다른 스레드 계산을 일시적으로 차단하려면 계산 지점에 잠금을 추가해야 합니다.
실시간으로 계수하고 출력하려면 계수와 출력을 함께 잠그면 됩니다. 그렇지 않으면 서로 다른 스레드의 계수와 출력 결과가 순서대로 처리되지 않을 수 있습니다.
이런 방식으로 잠그면 순차 처리 및 순차 출력이 보장되지만 성능이 다소 저하됩니다.
코드의 잠금 위치는 매우 중요합니다.
이 프로그램은 3개의 연산을 추가하게 되는데, 그 이유는 이 스레드가 200회에 도달하지 않았는데 처음으로 추가되는 스레드가 있어야 하므로 add에서 판단하세요.
다음과 같이 코드 코드를 복사합니다.
CommonSigleton MyCounter =CommonSigleton.Instance;
/// <요약>
/// 스레드 작업
/// </summary>
공공 무효 DoSomeWork()
{
///표시 문자열 구성
문자열 결과 = "";
///Sigleton 인스턴스 생성
System.Threading.Thread.Sleep(100);
int i = 0;
동안(MyCounter.GetCounter() < 200)
{
// 카운트가 출력과 일치하는지 확인합니다. 카운트와 출력 사이에 시간 간격이 추가되더라도 이 영역은 다른 스레드가 작동하지 못하도록 잠깁니다.
자물쇠(이것)
{
///카운트 시작
내카운터.추가();
System.Threading.Thread.Sleep(100);
스레드 스레드 = Thread.CurrentThread;
결과 += "스레드";
결과 += i++.ToString() + "――>" + thread.Name + " ";
결과 += "현재 개수:";
결과 += MyCounter.GetCounter().ToString();
결과 += "/n";
Console.WriteLine(결과);
// 표시 문자열을 지웁니다.
결과 = "";
}
}
}
공공 무효 StartMain()
{
스레드 thread0 = Thread.CurrentThread;
thread0.Name = "스레드 0";
스레드 thread1 =new Thread(new ThreadStart(DoSomeWork));
thread1.Name = "스레드 1";
스레드 thread2 =new Thread(new ThreadStart(DoSomeWork));
thread2.Name = "스레드 2";
스레드 thread3 =new Thread(new ThreadStart(DoSomeWork));
thread3.Name = "스레드 3";
스레드1.시작();
스레드2.시작();
스레드3.시작();
///스레드 0은 다른 스레드와 동일한 작업만 수행합니다.
DoSomeWork();
}
}