Skip to main content

박수완

1. 📌 핵심 개념 정리

✅ 요약하기

이 장에서는 여러 스레드를 동시에 돌리는 이유를 논한다. 여러 스레드를 동시에 돌리는 어려움도 논한다. 이런 어려움에 대처하고 깨끗한 코드를 작성하는 방법도 몇 가지 제안한다.

  1. 동시성이 필요한 이유?

    동시성은 결합을 없애는 전략이다. 즉, 무엇과 언제를 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다. 그래서 호출 스택을 살펴보면 프로그램 상태가 곧바로 드러난다. 컨테이너는 동시성을 부분적으로 관리한다. 웹 요청이 들어올 때마다 웹 서버는 비동기식으로 서블릿을 실행한다. 각 서블릿 스레드는 다른 서블릿 스레드와 무관하게 자신만의 세상에서 돌아간다. 이번에는 정보를 대량으로 분석하는 시스템을 살펴보자 시스템은 모든 정보를 처리한 후에야 최종적인 답을 낸다. 정보를 나눠 여러 컴퓨터에서 돌리면 어떨까? 대량의 정보를 병렬로 처리한다면?


    다음은 동시성과 관련한 일반적인 미신과 오해다.

  • 미신과 오해

    • 동시성은 항상 성능을 높여준다

      대기 시간이 아주 길어 여러 스레드가 프로세서를 공유할 수 있거나 여러 프로세서가 동시에 처리할 독립적인 계산이 충분히 많은 경우에만 성능이 높아진다.

    • 동시성을 구현해도 설계는 변하지 않는다

      단일 스레드 시스템과 다중 스레드 시스템은 설계가 판이하게 다르다. 일반적으로 무엇과 언제를 분리하면 시스템 구조가 크게 달라진다.

      • 웹 또는 EJB 컨테이너를 사용하면 동시성을 이해할 필요가 없다.

        실제로는 컨테이너가 어떻게 동작하는지 어떻게 동시 수정, 데드락 등과 같은 문제를 피할 수 있는지를 알아야 한다.


        다음은 동시성과 관련한 타당한 생각이다.

        • 동시성은 다소 부하를 유발한다

          성능 측면에서 부하가 걸리며 코드도 더 짜야한다.

        • 동시성은 복잡하다.

        • 일반적으로 동시성 버그는 재현하기 어렵다.

        • 동시성을 구현하려면 흔히 근본적인 설계 전략을 재고해야 한다.


  1. 동시성 방어 원칙

    • 단일 책임 원칙

      동시성은 복잡성 하나만으로도 따로 분리할 이유가 충분하다. 동시성 련 코드는 다른 코드와 분리해야 한다는 뜻이다.

    • 따름 정리: 자료 범위를 제한하라

      객체 하나를 공유한 후 동일 필드를 수정하던 두 스레드가 서로 간섭하므로 예상치 못한 결과를 내놓는다.
      이런 문제를 해결하는 방안으로 공유 객체를 사용하는 코드 내 임계영역을 synchronized 키워드로 보호 하라고 권장한다.
      이런 임계영역의 수를 줄이는 기술이 중요하다.

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

      공유 자료를 줄이려면 처음부터 공유하지 않는 방법이 제일 좋다. 어떤 경우에는 객체를 복사해 읽기 전용으로 사용하는 방법이 가능하다. 어떤 경우에는 각 스레드가 객체를 복사해 사용한 후 한 스레드가 해당 사본에서 결과를 가져오는 방법도 가능하다.

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

      각 스레드는 클라이언트 요청 하나를 처리한다. 모든 정보는 비공유 출처에서 가져오며 로컬 변수에 저장한다. 그러면 각 스레드는 세상에 자신만 있는 듯이 돌아갈 수 있다. 독자적인 스레드로 가능하면 다른 프로세서에서 돌려도 괜찮도록 자료를 독립적인 단위로 분할하라


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

    • 스레드 환경에 안전한 컬렉션

      언어가 제공하는 클래스를 검토하라 자바에서는 java.util.concur-rent, java.util.concurrent.atomic, java.util.concurrent.locks를 익혀라


  1. 실행 모델을 요약 내용이해하라
    .
    .
    .

2. 🤔 이해가 어려운 부분

🔍 질문하기

책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      해당 개념이 헷갈리거나 명확하지 않았던 점을 구체적으로 설명합니다.
    • 궁금한 점
      해당 개념이 어떤 원리로 동작하는지, 실무에서 어떻게 활용되는지 등을 질문 형태로 정리합니다.

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      .
    • 궁금한 점
      .

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      .
    • 궁금한 점
      .

3. 📚 참고 사항

📢 논의하기

관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.

  1. 관련 자료 공유
    • 추가 자료
      관련 블로그 글이나 공식 문서 링크를 제공합니다.

  1. 논의하고 싶은 주제
    • 주제
      논의하고 싶은 내용을 간략히 정리합니다.
    • 설명
      논의하고 싶은 이유를 작성합니다.