부록 A 동시성2 (1)

가능한 실행 경로

책너두 5기 45일차

로버트 C. 마틴의 클린코드 p. 413~ p.419

내용정리

가능한 실행 경로

1
2
3
4
5
6
7
public class IdGenerator {
    int lastIdUsed;
    
    public int incrementValue() {
        return ++lastIdUsed;
    }
}

스레드 하나가 IdGenrator 인스턴스 하나를 사용한다고 가정하면 가능한 실행 경로, 가능한 결과도 하나다.

  • 반환값은 lastIdUsed 값과 동일하다. 두 값 모두 메서드를 호출하기 전보다 1이 크다.

스레드가 두 개라면? 그래서 각 스레드가 incrementValue 메서드를 한 번씩 호출한다면 결과는 어떨까? lastIdUsed 초깃값을 93으로 가정하면 결과는 다음 중 하나이다.

  • 스레드 1이 94, 스레드 2가 95를 얻고 lastIdUsed가 95가 된다.
  • 스레드 1이 95, 스레드 2가 94를 얻고 lastIdUsed가 95가 된다.
  • 스레드 1이 94, 스레드 2가 94를 얻고 lastIdUsed가 94가 된다.

경로 수

루프나 분기가 없는 명령 N개를 스레드 T개가 차례로 실행한다면 가능한 경로 수는

(NT)! / N!^T 이다.

결론

여러 스레드가 서로를 훼방놓을 수 있다는 것을 알면 충분하다.