October 25, 2022
구조적 개선만을 위해 동시성을 채택하는 건 아니다. 어떤 시스템은 응답 시간과 작업 처리량(throughput) 개선이라는 요구사항으로 인해 직접적인 동시성 구현이 불가피하다.
예시
미신과 오해
동시성은 항상 성능을 높여준다.
동시성을 구현해도 설계는 변하지 않는다.
타당한 생각
동시성은 다소 부하를 유발한다.
동시성은 복잡하다.
일반적으로 동시성 버그는 재현하기 어렵다.
동시성을 구현하려면 흔히 근본적인 설계 전략을 재고해야 한다.
public class X {
private int lastIdUsed;
public int getNextId() {
return ++lastIdUsed;
}
}
X
를 생성하고 lastIdUsed
필드를 42로 설정한 다음, 두 스레드가 해당 인스턴스를 공유한다.getNextId();
를 호출하면 결과는 아래 셋중 하나이다.
lastIdUsed
= 44)lastIdUsed
= 44)lastIdUsed
= 43)synchronized
키워드로 보호하라고 권장한다.동기화 비용 > 객체 복사
비용 일 수 있다.다중 스레드 프로그래밍에서 사용하는 실행 모델 몇 가지
생산자-소비자(Producer-Consumer)
읽기-쓰기(Readers-Writers)
공유 객체 하나에 여러 메서드가 필요한 상황에서는 다음 세 가지 방법을 고려한다.
클라이언트에서 잠금
서버에서 잠금
서버를 잠그고 모든 메서드를 호출한 후 잠금을 해제하는
메서드를 구현한다. 클라이언트는 이 메서드를 호출한다.연결(Adapted) 서버
서버에서 잠금
방식과 유사하지만 원래 서버는 변경하지 않는다.