본문 바로가기

Back-end/Basic

Thread-safe 하다는 의미와 설계하는 법

두 개 이상의 스레드race condition에 들어가거나 같은 객체에 동시에 접근해도,
연산결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미합니다.

  • java.util.concurrent 패키지 하위의 클래스를 사용합니다.
  • 인스턴스 변수를 두지 않습니다.
  • Singleton 패턴을 사용합니다. (이 때, 일반적으로 구현한 Singleton Pattern은 Thread-safe 하지 않습니다.)
  • 동기화(syncronized) 블럭에서 연산을 수행합니다.



Thread-safe
멀티 스레드 프로그래밍에서 어떤 함수나, 변수, 혹은 객체가 어떤 스레드로부터 동시에 접근이 이루어져도
문제가 생기지 않는다는 것을 의합니다.
-> 여러 곳에서 동시에 접근하더라도 그 결과가 올바르다는 것을 의미합니다.

Thead-safe 구현 방법

  • 재진입성(Re-entrancy)
    어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바르게 주어져야 한다.
  • 상호 배제(Mutual Exclusion)
    공유 자원을 사용할 경우, 해당 자원에 대한 접근Semaphore와 같은 LOCK으로 통제한다.
    • 임계 구역(Critical Section)을 정의한다. 해당 임계구역은 한번에 하나의 스레드만 접근할 수 있도록 해야한다.
    • Java에서는 syncronized를 사용하여 임계구역을 정의한다.
  • 스레드 지역 저장소(Thread-Local Storage)
    공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소를 사용함으로써 동시 접근을 막는다.
    이 방식은 동기화 방법과 관련되어 있고, 공유 상태를 피할 수 없을 경우 사용한다.
  • 원자 연산(Atomic Operation)
    공유 자원에 접근할 때, 원자 연산 또는 원자적으로 정의된 접근 방법을 사용하여 상호 배제를 구현할 수 있다.
  • 불변 객체(Immutable Object)
    객체 생성 이후에 값을 변경할 수 없도록 만든다.


참고: https://velog.io/@guswns3371/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-Thread-safe

'Back-end > Basic' 카테고리의 다른 글

쿠버네티스(kubernetes)를 왜 쓰는가?  (0) 2022.03.06
Jenkins 설정  (0) 2021.11.23
멀티스레드 프로그래밍  (0) 2021.11.21
동기와 비동기의 차이(블로킹, 넌블로킹) / 장단점  (0) 2021.11.21
컨텍스트 스위칭  (0) 2021.11.21