클린 코드 13장 동시성

inhalin·2022년 3월 17일
0

노개북 클린 코드

목록 보기
12/12

노개북 2기 완주 이후 Extra

  • 13장 동시성(pp.226~244)

요약 및 느낀 점

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

0개의 댓글