Skip to main content

진소희

1. 📌 핵심 개념 정리

✅ 요약하기

각자동시성과 해당 챕터에서 중요하다고 느낀 개념이나 아이디어를 간략하게 정리하고 개선 전, 후에 대깔끔 예시 코드 비교양립 개념을 설명합니어렵다.

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

    • 동시성은 결합을 없애는 전략이다. 즉, 무엇과 언제를 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다.
    • 무엇과 언제를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다. 따라서 시스템을 이해하기가 쉽고 문제를 분리하기도 쉽다.
    • 예를 들어, 웹 애플리케이션이 표준으로 사용하는 서블릿 모델을 살펴보자. 서블릿은 웹 혹은 EJB 컨테이너라는 우산 아래서 돌아가는데, 이들 컨테이너는 동시성을 부분적으로 관리한다. 웹 요청이 들어올 때마다 웹 서버는 비동기식으로 서블릿을 실행한다. 서블릿 프로그래머는 들어오는 모든 웹 요청을 관리할 필요가 없다. 원칙적으로 각 서블릿 스레드는 다른 서블릿 스레드와 무관하게 자신만의 세상에서 돌아간다.
    • 다른 예시로, 매일 수많은 웹 사이트에서 정보를 가져와 요약하는 정보 수집기를 생각해보자. 만약 수집기가 단일 스레드 프로그램이라면 한 번에 한 웹 사이트를 방문해 정보를 가져오며, 이 과정에서 한 사이트를 끝내야 다른 사이트로 넘어잔다. 매일 실행하므로 24시간 안에 끝내야 한다. 그런데 웹 사이트를 계속 추가하면 정보를 수집하는 시간도 늘어나므로 결국은 24시간을 넘긴다.
    • 또 다른 예시로, 한 번에 한 사용자를 처리하는 시스템이 있다고 가정하자. 한 사용자를 처리하는 시간은 1초다. 사용자가 소수라면 시스템이 아주 빨리 반응한다. 하지만 사용자 수가 늘어날수록 시스템이 응답하는 속도도 늦어진다.
    • 미신과 오해
      • 이렇듯 반드시 동시성이 필요한 상황이 존재한다. 하지만, 동시성은 어렵다.
      • 동시성은 항상 성능을 높여준다: 동시성은 때로 성능을 보여준다. 대기 시간이 아주 길어 여러 스레드가 프로세서를 공유할 수 있거나, 여러 프로세서가 동시에 처리할 독립적인 계산이 충분히 많은 경우에만 성능이 높아진다. 어느 쪽도 일상적으로 발생하는 상황은 아니다.
      • 동시성을 구현해도 설계는 변하지 않는다 : 단일 스레드 시스템과 다중 스레드 시스템은 설계가 판이하게 다르다. 일반적으로 무엇과 언제를 분라하면 시스템 구조가 크게 달라진다.
      • 웹 또는 EJB 컨테이너를 사용하면 동시성을 이해할 필요가 없다 : 실제로는 컨테이너가 어떻게 동작하는지, 어떻게 동시 수정, 데드락 등과 같은 문제를 피할 수 있는지를 알아야만 한다.
    • 동시성은 다소 부하를 유발한다 : 성능 측면에서 부하가 걸리며, 코드도 더 짜야 한다
    • 동시성은 복잡하다 : 간단한 문제라도 동시성은 복잡하다.
    • 일반적으로 동시성 버그는 재현하기 어렵다 : 그래서 진짜 결함으로 간주되지 않고 일회성 문제로 여겨 무시하기 쉽다.
    • 동시성을 구현하려면 흔히 근본적인 설계 전략을 재고해야 한다.

  1. 난관

    • 동시성을 구현하기 어려운 이유는 무엇일까?

  1. 동시성 방어 원칙


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


  1. 실행 모델을 이해하라


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


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


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


  1. 스레드 코드 테스트하기


2. 🤔 이해가 어려운 부분

🔍 질문하기

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

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

3. 📚 참고 사항

📢 논의하기

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

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

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