// 공유 자원에 대해 스레드 동기화 처리가 되어 있는 함수 public void IncreaseNum2(object obj) { NumClass nc = obj as NumClass; for (int i = 0; i < 100000; i++) { lock (nc) // 한 순간에 오직 한 개의 스레드만 접근 허용 { nc.Number++; } } }
// 공유 자원에 대해 스레드 동기화 처리가 되지 않은 함수 public void IncreaseNum1(object obj) { NumClass nc = obj as NumClass; for (int i = 0; i < 100000; i++) // 숫자가 커질수록 잘못된 예측할 수 없는 결과가 나옴. { nc.Number++; } // 1. 메모리의 힙 영역에서 number 변수에 해당하는 값을 가져온다. // 2. 가져온 값에 1을 더한다. // 3. 1이 더해진 새로운 값을 메모리의 힙 영역에 저장한다. }
static void Main(string[] args) { NumClass numObj1 = new NumClass(); NumClass numObj2 = new NumClass(); unsynchronizedMethod(); synchronizedMethod(); // 공유 자원에 대해 스레드의 동기화 처리가 되지 않은 경우 void unsynchronizedMethod() { Thread t1 = new Thread(numObj1.IncreaseNum1); Thread t2 = new Thread(numObj1.IncreaseNum1); t1.Start(numObj1); t2.Start(numObj1); t1.Join(); t2.Join(); Console.WriteLine($"unsynchronizedMethod() 결과 : {numObj1.Number}"); } // lock을 사용하여 공유 자원에 대해 스레드의 동기화 처리가 된 경우 void synchronizedMethod() { Thread t1 = new Thread(numObj2.IncreaseNum2); Thread t2 = new Thread(numObj2.IncreaseNum2); t1.Start(numObj2); t2.Start(numObj2); t1.Join(); t2.Join(); Console.WriteLine($"synchronizedMethod 결과() : {numObj2.Number}"); } }
static void printArrays() { Console.WriteLine("Структура"); var numStruct1 = new NumStruct(); var numStruct2 = new NumStruct(); numStruct2.integers = new int[] { 1, 2, 3, 4, 5 }; numStruct1 = numStruct2; printIntegers(numStruct1.integers); printIntegers(numStruct2.integers); changeIntegers(numStruct2.integers); printIntegers(numStruct1.integers); printIntegers(numStruct2.integers); numStruct2.integers = new int[] { 3, 5, 7, 9 }; printIntegers(numStruct1.integers); printIntegers(numStruct2.integers); Console.WriteLine("Класс"); var numClass1 = new NumClass(); var numClass2 = new NumClass(); numClass2.integers = new int[] { 1, 2, 3, 4, 5 }; numClass1 = numClass2; printIntegers(numClass1.integers); printIntegers(numClass2.integers); changeIntegers(numClass2.integers); printIntegers(numClass1.integers); printIntegers(numClass2.integers); numClass2.integers = new int[] { 1, 3, 5, 7 }; printIntegers(numClass1.integers); printIntegers(numClass2.integers); }