하나의 객체를 두개의 스레드가 접근할 때 생길수 있는일
귤의 상태가 불량일때 badCounter 객체에 존재하는 메서드를 실행시킨다.
상한 귤을 카운트하기 위해 스레드가 2개 존재한다.
state가 0인 상태에서 스레드1이 2번까지 진행하여 state가 1이 되고, 레지스터1의 연산값을 저장하기 전에 스레드2로 컨텍스트 스위칭이 발생하게 된다면?
스레드2는 다시 state가 0인 값을 레지스터에 저장하고, 레지스터는 연산 후 state에 1을 저장한다.
스레드2의 작업이 끝나고 스레드1로 컨텍스트스위칭이 발생하게 되면 첫 컨텍스트 스위칭이 발생하기 전 스레드1이 가지고 있던 state값은 1이고, 1을 다시 메모리에 저장한다.
스레드1과 스레드2가 작업하여 state값을 2를 기대하지만, 실질적으로 메모리에 저장된 state값은 1이다.
여러 프로세스/스레드가 동시에 같은 데이터를 조작할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황
여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는것
public void increment(){state++;}
//하나의 동작이 아니라, CPU에서는 여러 단계로 진행된다.
increment()메서드가 하나의 스레드에서만 실행 가능하게 설정하면 어떻게 될까?
이미 실행중인 스레드가 존재하면 컨텍스트스위칭이 발생하는게 아닌, 이전 스레드의 작업이 끝날때 까지 대기한다.
mutual exclusion(상호 배제)
한번에 하나의 프로세스/스레드만 critical section에서 실행할 수 있다.
progress(진행)
critical section이 비어있고 어떤 프레세스/스레드가 들어가기 원한다면 하나는 critical section에 들어가야한다.
bounded waiting(한정된 대기)
어떤 프로세스/스레드가 critical section에 들어가지 못하고 계속해서 기다리는게 아닌 일정 시간만 대기해야한다.