kok202
[2019.02.09] 클린 코드 (동시성1)

2019. 2. 9. 22:45[공부] 독서/클린 코드

동시성


동시성과 깔끔한 코드는 양립하기 어렵다.

그러나 동시성은 결합을 없애는 전략이다.

무엇과 언제를 분리하기 때문이다.


동시성은 필요하다.

동시성은 다소 부하가 생긴다.

동시성은 코드도 더 짜야한다.

동시성은 복잡하다.

동시성은 버그를 재현하기 힘들다.

동시성은 근본적인 설계 전략을 재고해야한다.


동시성 방어 원칙

1. 단일 책임 원칙 -> 동시성 코드는 다른 코드와 분리하라

2. 자료 범위 제한 -> 공유자료를 최대한 줄이고 캡슐화하라, synchronized로 임계영역을 보호하라

3. 자료 사본 사용하기

4. 스레드를 독립적으로 구현하라.

5. 라이브러리를 이해하라.


스레드 환경에 안전한 컬랙션

java.util.concurrent 패키지

java.util.concurrent.atomic 패키지

java.util.concurrent.locks 패키지


대부분의 공유 자원과 동시성으로 인한 문제 범주

1. 생산자 - 소비자

2. 식사하는 철학자

3. 읽기 - 쓰기


(리마인드) 데드락이 발생하는 이유

1. Relock

2. Reverselock


공유 객체 하나에는 메서드 하나만 사용하라.

공유 클래스 하나에 synchronized 하는 메서드가 여럿이라면 재고해라.


synchronized는 임계영역에만 써라

그리고 임계영역이 너무크면 프로그램 성능이 떨어지니 동기화 하는 부분은 최대한 작게 만들어라.


다중 스레드 코드

 시도

 이유 

1. 당연히 순차 실행은 되야한다.

 

 2. 다양한 환경에 쉽게 끼워 넣을 수 있도록 구현하라.

 - 스레드 갯수를 조율할 수 있도록 하라

 - 스레드 속도를 조정가능하게 하라


스레드 코드 테스트하기

 시도

 이유

 1. 프로세서 수보다 많은 스레드를 돌려봐라

 스레드 스와핑시 문제를 캐치할 수 있다.

 2. 실행 중 스레드 수를 바꿔봐라

 적절한 스레드 개수를 파악하려면 시행착오가 필요하다.

 3. 다른 플랫폼에서 돌려봐라

 OS 마다 스레드 처리 정책이 다를 수 있다.

 4. 보조 코드를 넣고 돌려서 강제로 실패를 일으켜봐라

 상상하지 못한 스레드 버그를 일으켜 보기 위해서다.


보조 코드 (흔들기 기법)

JigglePoint 클래스를 만들어봐라

JigglePoint 클래스의 jiggle 메소드는 wait(), sleep(), yield(), priority(), nop 중 하나를 실행하는 메소드다.

JigglePoint.jiggle()을 메소드 곳곳에 넣어서 강제로 실패를 일으켜볼 수 있다.