1. 동시성 프로그래밍 : 어플리케이션을 효율적으로 실행하기 위해 멀티코어를 온전히 활용하도록 구현하는 방식.
서버(코어)를 효율적으로 사용하여, 처리량을 최대화하기 위한 기법.
하나만 주구장창 붙들고 있는 게 아닌, 대기중에 다른일 처리하고 온다든가 하는 것도 동시성의 구현.
cf)병렬성: 서버를 늘려 처리량을 늘리는 것
동시성과 병렬성은 "어플리케이션"의 관점에서 (not 클라이언트) 생각할 것.
내 어플리케이션의 효율성을 높이고, 메모리 누수나 자원 낭비 되는 일이 없도록 신경써야 함.
2. 동시성 프로그래밍의 미신과 오해
1)동시성은 항상 성능을 높여준다 (X)
: 대기 시간이 길어서 여러 스레드가 프로세서를 공유할 수 있거나, 여러 프로세서가 동시에 처리할 독립적 계산이 충분히 많은 경우에 한정됨.
ex) 웹서핑 하다가 이미지 여러개 불러올때
2)동시성 구현해도 설계는 변할 필요가 없다 (X)
: 단일 스레드 시스템과 다중 스레드 시스템은 설계가 다름. 무엇 과 언제 를 분리할 때, 시스템의 구조는 크게 달라짐
3)컨테이너를 사용해도 동시성을 이해해야 한다(O)
: 컨테이너의 동작을 이해해야 한다. 동시 수정, 데드락 같은 문제를 피할 수 있는지 알아봐야 함.
3. 안전한 동시성 프로그래밍
1)단일책임원칙(SRP) 설계 : 동시성 관련 코드는 다른 코드와 분리해야 함.
2)자료범위 제한: 공유 자료를 최대한 줄이기. 임계 영역 수 최소화 & 임계 영역을 synchronized로 보호
3)자료 사본 사용: 공유 자료를 줄이려면, 최대한 공유하지 않기. 객체 복사해서 읽기 전용 사본을 사용하는 것이 안정적.
4)스레드는 가능한 독립적으로 구현하기: 다른 스레드와 자료 공유 하지 않기.
* java.util.concurrent - thread safe한 컬렉션
5)동기화하는 메서드 사이에 존재하는 의존성 이해하기 : 공유 객체 하나에는 메서드 하나만 사용하기.
클라이언트단에서 잠그거나 / 서버단에서 잠그거나/ 연결서버에서 잠금 수행하는 중간단계를 생성하거나.
4. 동시성 테스트
문제를 노출하는 테스트 케이스 작성
프로그램/시스템의 설정과 부하를 바꿔가며 자주 테스트 수행 / 배포 전 테스트환경에서 충분히 검증
실패시 원인 추적
다시 돌렸더니 돼요 하고 넘어가지 말 것
코드에 보조 코드(wait/sleep/yield/priority/ ThreadJigglePoint.jiggle() ) 추가하여 구현
배포후에도 모니터링
'study > Java' 카테고리의 다른 글
클린코드(Clean code) 15~16장 : 실제 라이브러리 분석 (JUnit, SerialDate) (0) | 2022.09.27 |
---|---|
클린코드(Clean code) 14장 - 점진적인 개선 (0) | 2022.09.26 |
클린코드(Clean code) 12장 - 창발성 (0) | 2022.09.22 |
클린코드(Clean code) 11장 - 시스템 (0) | 2022.09.21 |
클린코드(Clean code) 10장 - 클래스 (0) | 2022.09.19 |
댓글