스레드 안전한 클래스

권혁모·2022년 9월 22일
0

스레드 안전

스레드 안전은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로 부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다.

wiki - 스레드 안전

여러 스레드가 클레스에 접근할 때, 실행 환경이 해당 스레드들의 실행을 어떻게 스케쥴하든 어디에 끼워 넣든, 호출하는 쪽에서 추가적인 동기화나 다른 조율없이도 정확하게 동작하면 해당 클래스는 스레드 안전하다고 말한다.

스레드 안정성이 보장되지 않은 상황

여러 스레드가 변경할 수있는 하나의 상태 변수를 적절한 동기화 없이 접근하는 경우

해결

  • 해당 상태변수를 스레드 간에 공유하지 않거나,
  • 해당 상태변수를 변경할 수 없도록 만들거나,
  • 해당 상태변수에 접근할 땐 언제나 동기화를 사용한다.

동기화

Synchronized

해당 변수를 접근 하는 메서드 또는 해당 객체를 Synchronized 키워드를 사용하여 하나의 스레드만 해당 자원을 사용할 수 있도록 Blocking을 한다. 또는 동기화 블록을 생성헤 메소드안의 동기화 블럭을 따로 작성한다.

volatile

멀티 스레드 환경에서는 각 스레드에서 Main Memory에서 읽은 변수값을 CPU Cache에 저장하게 된다.
출처: https://nesoy.github.io/articles/2018-06/Java-volatile

따라서 변수 값 불일치 문제가 발생할 가능성이 생긴다. volatile 키워드를 사용하면 Main Memory에 저장하고 읽어오기 때문에 변수값 불일치 문제가 해결 될 수 있다.

Atomic(단일 연산 변수)

멀티 스레드 환경에서 non-blocking을 하며, 원자성을 보장하기 위해 나온 개념
CAS(Compare And Swap) 알고리즘을 사용하여 동작한다.
동작 원리는 다음과 같다.

  • 인자로 기존값과 변경할 값을 전달
  • 기존값이 현재 메모리가 가지고 있느 값고 같다면 변경할 값을 반영한다.
  • 다르다면 같은 시도를 반복한다.

출처 및 참고

0개의 댓글