CleanCode

[CleanCode] 동시성

zamezzz 2023. 12. 10. 15:21

CleanCode - 동시성

 

동시성이 필요한 이유?

동시성은 '무엇''언제'를 분리하는 전략입니다.
'무엇''언제'를 분리하면 애플리케이션 구조와 효율이 극적으로 나아집니다.

 

동시성에 대한 일반적인 오해

  • 동시성은 항상 성능을 높여준다.
    • 여러 스레드가 프로세서를 공유하거나, 여로 프로세서가 동시에 처리할 계산이 충분히 많은 경우 성능이 높아집니다.
    • 위 경우 같을 때 성능을 높여줍니다. 항상은 아닙니다.
  • 동시성을 구현해도 설계는 변하지 않는다.
    • 단일 스레드와 다중 스레드 시스템은 설계가 다릅니다.
  • 웹 또는 EJB 컨테이너를 사용하면 동시성을 이해할 필요가 없다.
    • 반드시 이해해야 데드락, 동시 수정등의 문제를 피할 수 있습니다.

동시성 방어 원칙

  • 단일 책임 원칙 
    • 주어진 메서드/클래스/컴포넌트를 변경할 이유가 하나여야 한다는 원칙
    • 동시성 관련 코드는 다른 코드와 분리해야 한다는 뜻입니다.
  • 따름 정리 : 자료 범위를 제한하라.
    • 공유 객체를 사용하는 코드 내 임계영역을 synchronized 키워드로 보호하라고 권장합니다.
    • 자료를 캡슐화 하여 공유 자료를 최대한 줄여야 합니다.
  • 따름 정리 : 자료 사본을 사용하라
    • 공유 자료를 줄이려면 처음부터 공유하지 않는 방법이 제일 좋습니다.
    • 어떤 경우에는 객체를 복사해 읽기 전용으로 사용하는 방법이 가능합니다.
    • 어떤 경우에는 각 스레드가 객체를 복사해 사용한 후 한 스레드가 해당 사본에서 결과를 가져오는 방법이 가능합니다.
  • 따름 정리 : 스레드는 가능한 독립적으로 구현하라
    • 각 스레드는 클라이언트 요청 하나를 처리하게 합니다.
    • 그러면 다른 스레드와 동기화 할 필요가 없으므로 각 스레드는 세상에 자신만 있는 듯이 돌아갈 수 있습니다.


마무리
다중 스레드 코드는 올바로 구현하기 어렵습니다. 간단했던 코드가 여러 스레드와 공유자료를 추가하면서 악몽으로 변하기 때문입니다.

또한 동시성 오류를 일으키는 잠정적인 원인을 철저히 이해하고, 사용하는 라이브러리와 알고리즘을 이해 합니다.

하지만 어떻게든 문제는 생깁니다. 처음엔 간단하지만 점차 문제가 생기기 때문입니다.

그러므로 반복적으로 테스트 해야 합니다.

반응형

'CleanCode' 카테고리의 다른 글

[CleanCode] 창발성  (1) 2023.12.05
[CleanCode] 시스템  (0) 2023.11.14
[CleanCode] 클래스  (0) 2023.11.13
[CleanCode] 단위 테스트  (1) 2023.11.11
[CleanCode] 경계  (0) 2023.11.11