Clean code - 동시성

코딩하는스님·2022년 1월 26일
0

클린코드

목록 보기
1/1
post-thumbnail

객체는 처리의 추상화이다. 쓰레드는 일정의 추상화이다.
Objects are abstractions of processing. Threads are abstractions of schedule.
- James O. Coplien -

  • 동시성과 깔끔한 코드는 incompatible하다. 동시성을 고려한 코드는 복잡해지기 때문이다. 동시성을 고려하면서 깔끔하게 코드를 짜는 법을 알아보자.

동시성이 필요한 이유?

  • 동시성은 결합을 없애는 전략이다. 무엇언제를 분리한다.
  • 싱글 쓰레드 프로그램은 무엇언제가 밀접하게 연관이 되어 있어 무엇언제 발생했는지 알 수 있다.
    • 따라서 break point를 걸면 시스템의 상태를 알 수 있다.
  • 무엇언제를 분리하면 구조와 효율이 극적으로 나아진다?
    • ????
    • Servlet
      EJB Container 안에서 돌아간다.
      Container는 동시성을 부분적으로 관리한다.
      웹 요청이 들어올 때마다 비동기식으로 서블릿을 실행한다. -> 쓰레드
      하지만 Container의 decoupling은 완벽과는 거리가 멀고, 동시성의 정확한 구현을 위해 각별한 노력을 취해야 한다.
  • 응답 시간과 처리량 개선을 위해 필요하다.
    • 단일 쓰레드 프로그램에서 쓰레드가 blocking되는 경우에 다음 작업이 굉장히 늦어진다.
    • 하지만 멀티 쓰레드 프로그램에서 병렬로 처리하게 되면 blocking에 상관없이 다음 작업을 처리할 수 있다.
    • 다만 컴퓨팅 용량을 더 사용하게 될 것이다.

미신과 오해

오해

동시성은 항상 성능을 높여준다.
동시성을 구현해도 설계는 변하지 않는다.
웹 또는 EJB 컨테이너를 사용하면 동시성을 이해할 필요 없다.

타당한 생각

동시성은 다소 부하를 유발한다.
동시성은 복잡하다.
일반적으로 동시성 버그는 재현하기 어렵다.
동시성을 구현하려면 흔히 근본적인 설계 전략을 재고해야 한다.

동시성 구현은 왜 어려울까?

public class X{
	private int lastIdUsed;
    
    public int getNextId(){
    	return ++lastIdUsed;
    }
}
  • lastIdUsed가 42일 때, 두 쓰레드가 접근한다고 생각해보자.
    • A: 43, B: 44
    • A: 44, B: 43
    • A: 43, B: 43
      의 케이스가 생길 수 있다. 그런데, JIT 컴파일러가 처리하는 방식을 생각했을 때, 접근할 수 있는 경로는 12,870개라고 한다.
니모닉설명피연산자 스택
ALOAD 0this를 피연산자 스택에 넣는다.this
DUP스택 첫째 값(this)를 복사한다. 이제 피연산자 스택에 this 값 두 개가 존재한다.this, this
GETFIELD lastId스택 첫째 값(this)의 lastId 필드에서 값을 가져와 스택에 넣는다.this, 42
ICONST_1스택에 정수 상수 1을 넣는다.this, 42, 1
IADD스택 첫째 값(1)을 스택 둘째 값(42)에 더하고 그 결과(43)을 스택에 넣는다.this, 43
DUP_X143을 복사해 this 아래 넣는다.43, this, 43
PUTFIELD lastID스택 첫째 값(43)을 스택 둘째 값(this)이 가리키는 현재 객체의 lastID 필드에 넣는다.43
IRETURN스택 첫째 값이자 유일한 값(43)을 반환한다.(empty)

동시성 방어 원칙

SRP

따름 정리(corollary) : 자료 범위를 제한하라

따름 정리 : 자료 사본을 사용하라

따름 정리 : 쓰레드는 가능한 독립적으로 구현하라

라이브러리를 이해하라

실행 모델을 이해하라

동기화 하는 메서드 사이에 존재하는 의존성을 이해하라

동기화하는 부분을 작게 만들어라

올바른 종료 코드는 구현하기 어렵다.

쓰레드 코드 테스트하기

출처

로버트 C.마틴, 클린 코드, 인사이트, 2020, p225-p244

profile
👨🏻‍💻👨🏽‍🦲

0개의 댓글