목차
동시성과 깔끔한 코드는 양립하기 어렵.
여러 스레드를 동시에 돌리는 이유, 여러 스레드를 동시에 돌리는 어려움, 이런 어려움에 대처하고 깨끗한 코드를 작성하는 방법들, 동시성을 테스트하는 방법과 문제
동시성
→ 결합을 없애는 전략. 무엇(what)과 언제(when)를 분리하는 전략
스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접
∴ 호출 스택을 보면 프로그램 상태 알 수 있음.(단일 스레스 프로그램 디버깅 시 breakpoint 이용)
무엇과 언제를 분리(즉, 다중 스레드 사용) ⇒ 애플리케이션의 구조 효율 ↑, 시스템 이해 쉽고 문제 분리 쉽다
ex) 서블릿(servlet)모델
서블릿은 웹 or EJB 컨테이너 아래에서 돌아가는 데 이 컨테이너는 동시성을 부분적으로 관리
→ 웹 요청이 들어올 때마다 웹 서버는 비동기식으로 서블릿을 실행하고 각 서블릿 스레드는 다른 서블릿 스레드와 무관하게 돌아간다.
→but 웹 컨테이너가 갖는 결함 분리 전략은 간단하지 않다. 그렇더라도 큰 구조적 이점 갖는다.
동시성의 이점
구조적 이점 → 시스템 이해, 문제 분리
응답 시간과 작업 처리량 개선 → ex) 한 번에 한 사이트에 방문하는 정보 수집기 등
즉, 병렬 처리가 필요할 때 동시성 채택.
미신과 오해
프로세스, 스레드 정리 참고
동시성이 어려운 이유
public class X {
private int lastIdUsed = 42;
public int getNextId() {
return ++lastIdUsed;
}
}
인스턴스 X를 생성하고 lastIdUsed = 42로 설정하고 두 개의 스레드가 해당 인스턴스를 동유한다고 가정.
getNextId() 동시 호출 시
i) 각각 43, 44 / lastIdUsed = 44
ii) 각각 44, 43 / lastIdUsed = 44
iii) 각각 43, 43 / lastIdUsed = 43
⇒ iii) 와 같은 결과 나올 수 있어 위험
⇒ 동시성 코드가 일으키는 문제로부터 시스템을 방어하는 원칙과 기술