본문 바로가기
study/Java

클린코드(Clean code) 13장 - 동시성

by 고기만두(개발자) 2022. 9. 25. 11:39
728x90
반응형

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() ) 추가하여 구현

배포후에도 모니터링

728x90
반응형

댓글