노개북 2기 완주 이후 Extra
요약 및 느낀 점
p.266
동시성과 깔끔한 코드는 양립하기 어렵다. 아주 어렵다.
동시성 사용 이유
- 결합을 없애서 무엇과 언제를 분리
- 예) servlet 컨테이너는 동시성을 부분적으로 관리함 -> 웹 서버는 요청이 들어올 때 비동기로 servlet 실행 -> 원칙적으로는 각 servlet은 독립적으로 동작함
- 즉, 구조적 개선에서 오는 이점 취득을 위해 사용하는 것
- 다만, 실제 웹 컨테이너가 제공하는 결합분리(decoupling) 전략은 완벽하지 않음
- 응답 시간과 작업 처리량(throughput) 개선
- 빅데이터 분석 시스템 - 분석 작업 병렬 처리
동시성 사용의 어려움
- 미신과 오해
- 항상 성능이 좋아짐(X) -> 특정 경우에는 맞지만 일상적 상황에선 딱히
- 설계 변하지 않음(X) -> 단일 스레드 시스템과 다중 스레드 시스템은 설계가 완전 달라짐
- 타당한 생각
- 다소 부하 유발(O) -> 성능 측면 부하, 코드도 길어짐
- 복잡함(O)
- 동시성 버그 재현의 어려움
- 설계 전략 재고 필요
깨끗한 코드 작성법
- SRP: 동시성 코드와 다른 코드 분리
- 자료 범위 제한: 임계 영역을 synchronized 키워드로 보호
- 스레드를 독립적으로 구현
- 스레드 safe한 컬렉션 사용
java.util.concurrent
, java.util.concurrent.atomic
, java.util.concurrent.locks
- 기본 실행 모델 이해하기
- 공유 객체 하나에 동기화 메서드 하나만 쓰기
- 동기화 부분 최대한 작게 만들기
- 종료 코드 알고리즘 공부
동시성 테스트 방법과 문제점
- 문제를 일부러 노출하는 테스트 케이스 작성
- 스레드 환경 안-밖의 디버깅 분리
- 환경 밖에서 먼저 버그 없이 정상 작동하도록 완성하고 스레드 환경 디버깅하기
- 보조 코드(instrument) 추가해서 강제 실패 일으키기
- 직접 구현: 지정 위치는? 어떤 함수를 어디에 호출? 오류 드러날 가능성 불확실함 등 단점 존재
- 자동화: jiggle() 로 무작위로 sleep이나 yield 호출 또는 nop
더 공부할 내용
- 실행 모델 기본 알고리즘 분석 및 해법
- Producer-Consumer
- Readers-Writers
- Dining Philosophers