728x90
반응형
CHAPTER 13 동시성
동시성 프로그래밍이란
어플리케이션을 효율적으로 실행하기 위해 멀티코어를 온전히 활용하도록 구현하는 방식
- 외부 서비스의 응답을 기다리면서 아무일도 하지 않으면 CPU 사이클이 낭비된다.
- 동시성을 구현한다고 해서 클라이언트 입장에서 자신의 요청이 빨리 처리되는게 아니다.
- 어플리케이션 입장에서는 효율적으로 코어를 사용하여 처리량을 높일 수 있다.
- 언어레벨에서 하드웨어의 멀티코어를 적절하게 사용하도록 지원하기 때문에 동시성만 신경써서 개발하면 된다.
- 동시성과 병렬성이 구현된 경우 서버(코어)를 효율적으로 사용하여 처리량을 최대화
- 클라이언트가 아닌 어플리케이션 관점에서의 효율성을 높여야 한다.
동시성이 필요한 이유
동시성은 항상 성능을 높여주는 것이 아닌, 때로 성능을 높여준다.
자바 서블릿 동시성 구현


- 요청이 들어오면 Thread Pool에 있는 Thread 가 서블릿의 service() 메서드를 호출한다.
- service 의 doGet(), doPost() 에서 요청에 대한 처리를 하도록 구현한다.동시성을 구현하면 설계를 바꾸어야 한다.
컨테이너를 사용해도 동시성을 이해해야 한다.
안전한 동시성 프로그래밍 규칙
단일 책임 원칙 설계
동시성 관련 코드는 다른 코드와 분리하라
자료 범위를 제한하라
공유 자료를 최대한 줄여라
- 동시 수정 문제를 피하기 위해 객체를 사용하는 코드 내 임계영역을 syncronized 키워드로 보호하라.
- 보호할 임계영역을 빼먹거나, 모든 임계영역을 보호했는지 확인하느라 수고가 드므로 임계영역의 수를 최소화 해야한다.자료 사본을 사용하라
- 공유 자료를 줄이려면, 최대한 공유하지 않는 방법이 제일 좋다.
- 객체를 복사해 읽기 전용으로 사용한다.
- 각 스레드가 객체를 복사해 사용한 후 스레드가 해당 사본에서 결과를 가져온다.
- 사본을 사용하는 방식으로 내부 잠금을 없애 수행 시간을 절약하는 것이 사본 생성과 가비지 컬렉션에 드는 부하를 상쇄할 가능성이 크다.스레드는 가능한 독립적으로 구현하라.
- 다른스레드와 자료를 공유하지 않는다.
- 서블릿처럼 각 스레드는 클라이언트 요청 하나를 처리한다.
- 모든 정보는 비공유 출처에서 가져오며 로컬 변수에 저장한다.
- 각 서블릿은 마치 자신이 독자적인 시스템에서 동작하는 양 요청을 처리한다.동기화하는 메서드 사이에 존재하는 의존성을 이해하라
- 공유 객체 하나에는 메서드 하나만 사용하라
- 클라이언트에서 잠금 - 클라이언트에서 첫 번째 메서드를 호출하기 전에 서버를 잠근다.
- 서버에서 잠금 - 서버에다 "서버를 잠그고 모든 메서드를 호출한 후 잠금을 해체하는" 메서드를 구현한다. 클라이언트는 이 메서드를 호출하기만 하면된다.
- 연결(adapter) 서버 - 잠금을 수행하는 중간 단계를 생성한다. 서버에서 잠금 방식과 유사하지만 원래 서버는 변경하지 않는다.스레드는 가능한 독립적으로 구현하라
- 다른 스레드와 자료를 공유하지 않는다.
- 서블릿처럼 각 스레드는 클라이언트 요청 하나를 처리한다.
- 모든 정보는 비공유 출처 (client의 request)에서 가져오며 로컬 변수에 저장한다.
- 각 서블릿은 마치 자신이 독자적인 시스템에서 동작하는 양 요청을 처리한다.라이브러리를 이해하라.
- java.util.concurrent 패키지를 이해하라.
- thread safe 한 컬렉션을 이용한다. ConcurrentHashMap, AtomicLong
- 서로 무관한 작업을 수행할 때는 executor 프레임워크를 사용한다.
- 가능하다면 thead 가 blocking 되지 않는 방법을 사용한다.동기화하는 메서드 사이에 존재하는 존재성을 이해하라.
- 공유 객체 하나에는 메서드 하나만 사용하라.
- 클라이언트에서 잠금 - 클라이언트에서 첫 번째 메서드를 호출하기 전에 서버를 잠근다. 마지막 메서드를 호출할 때 까지 잠금을 유지한다.
- 서버를 잠그고 메서드를 호출한 후 잠금을 해제하는 메서드를 구현한다.
- 잠금을 수행하는 중간 단계를 생성한다 (Adapter 서버)
동시성 테스트 방법
코드에 보조 코드를 넣는다.
드물게 발생하는 오류를 자주 발생시키도록 보조 코드를 넣는다.
동시성 코드를 실제 환경이나 테스트 환경에서 돌려본다.
다양한 요청과 상황에 동시성 코드가 정상 동작하는지 확인한다.
오픈소스 속 동시성 처리
AtomicLong
- Long 자료형을 thread safe 하게 랩핑한 값
- CPU 연산인 CAS(compare and swap) 을 지원해서 thread safe 하게 값을 사용할 수 있다.ReentrantReadWriteLock
728x90
반응형
'clean code' 카테고리의 다른 글
| [클린코드] 공통관심사항(cross-cutting concern)과 AOP(Aspect Oriented Programming) (0) | 2022.06.29 |
|---|---|
| [클린코드] CHAP 14 점진적인 개선 (0) | 2022.06.13 |
| [클린코드] CHAP 12 창발성 (0) | 2022.06.13 |
| [클린코드] CHAP 11 관심사 분리 패턴들 (0) | 2022.06.13 |
| [클린코드] CHAP 10 클래스 (0) | 2022.06.13 |