자바 멀티스레드 프로그래밍

Tin9oo·2024년 1월 16일

1. Synchronized 키워드 사용하기

  • synchronized가 적용된 메서드나 블록은 한 시점에 하나의 스레드만 실행할 수 있다.

2. 동시성 컬렉션 사용하기

  • java.util.concurrent 패키지에서 컬렉션들은 내부적으로 동시성을 관리하여, 별도의 외부 동기화 없이도 여러 스레드에서 안전하게 접근할 수 있게 해 준다.
    • ConcurrentHashMap
      • HashMap의 동시성 버전으로, 특정 부분의 데이터만 락을 걸어서 동시성을 높이고, 전체 맵을 락하지 않아도 되므로 성능이 향상된다.
    • CopyOnWriteArrayList
      • ArrayList의 동시성 버전으로, 쓰기 작업 발생 시 기존 내용을 복사하여 새로운 복사본에 쓰기 작업을 수행하고 이후 새로운 복사본으로 교체합니다.
        읽기 작업은 락 없이 수행되어 높은 동시성 읽기 성능을 제공합니다.
    • Atomic
      • 멀티스레드 환경에서 안전하게 변수의 원자적(atomic) 조작을 수행하기 위한 클래스
      • 변수의 값을 변경하거나 읽는 연산을 원자적으로 수행하여 스레드 간의 경쟁 조건(race condition)을 방지하고, 안전하게 동시성을 제어
      • Atomic 클래스는 CAS를 이용하여 동시성을 보장

        CAS(Compare And Swap)
        멀티스레드 환경에서 원자적 연산을 수행하기 위한 기법 중 하나
        변수의 현재 값과 기대하는 값이 일치할 때에만 새로운 값을 설정하는 연산을 수행

      • AtomicInteger는 synchronized 보다 적은 비용으로 동시성을 보장
  1. 불변 객체
    • 내부적인 상태가 변하지 않으므로 여러 스레드에서 동시에 참조해도 동시성 이슈가 발생하지 않는다.
      → Setter와 같은 객체의 상태를 변화시킬 수 있는 부분을 모두 제거해야한다.
      → final로 모든 변수를 선언할 수 있다.

이 글이 작성되기까지 도움주신 태곤님, 성환님, 수아님께 감사드립니다.

profile
🚙 HMG SOFTEER 3rd | 💻 BE

0개의 댓글