[CS] Thread-safe

말하는 감자·2025년 2월 13일

CS

목록 보기
29/33
post-thumbnail

정의

멀티 스레드 환경에서 변수, 객체나 함수 등의 자원이 여러 스레드에 의해 동시에 접근되어도 프로그램이 정상적으로 동작하는 상태를 스레드 세이프하다고 말한다.

즉, 여러 스레드가 같은 객체나 데이터를 사용할 때, 그 객체나 데이터가 일관성을 유지하도록 보장되는 프로그래밍의 속성

스레드 세이프하지 않은 경우

public class NoThreadSafeClass {

    private int result = 0;

    public int getResult()
    {
        for (int i = 0; i< 100 ; i++){
            result = result + 1;
        }
        return result;
    }
}

싱글 스레드 환경에서는 문제가 없지만, 멀티 스레드 환경에서는 전역변수(result)를 공유하기 때문에 문제가 발생할 수 있다.

  • ex. 한 스레드가 연산 중, 또 다른 스레드가 result값을 읽어와서 연산하는 경우 -> 데이터 일관성이 깨짐

스레드 세이프한 경우

public class ThreadSafeClass {

    private int result = 0;

    public synchronized int getResult()
    {
        for (int i = 0; i< 100 ; i++){
            result = result + 1;
        }
        return result;
    }
}

synchronized를 사용하여 동시에 result값을 증가시키지 못하게 하는, Thread-safe한 환경이다.

  • synchronized: 임계 영역에 여러 스레드가 동시에 접근할 때, 데이터의 일관성을 유지하기 위해 사용(한 번에 하나의 스레드만이 메서드를 실행할 수 있도록 함)

즉, 여러 스레드가 함수를 호출해서 동시에 실행되는 환경(멀티스레드)이더라도 임계 영역의 자원은 특정 시점에서 하나의 스레드만이 접근 가능하여 함수의 수행 결과가 서로 간섭하지 않고 정상적으로 나오는 상태이다.

Thread-safe 환경

1. Re-entrancy(재진입성)

  • 어떤 함수에 여러 스레드가 동시에 접근해도 언제나 같은 실행 결과를 보장한다.

2. Thread-local storage

  • 공유 자원의 사용을 최대한 줄여 스레드들의 동시 접근을 막고 로컬 변수를 사용하여, 각각의 스레드가 자신만의 변수를 가지게 한다.
  • 임계 영역 사용 지양, 독립적인 저장소 사용

3. Mutual exclusion(상호 배제)

  • 공유 자원에는 하나의 스레드만 접근 가능하게 한다.
  • 공유 자원 접근 시, lock,semaphore 등 동기화 기법으로 제어

Atomic operation

  • 공유 자원에 접근할 때 원자적 연산으로 구현
    • 공유 자원 변경에 필요한 연산을 분리하여, 실제 데이터 변경이 이루어지는 시점에 Lock을 걸어서, 그 동안 다른 스레드 접근을 막는것

Immutable Object

  • 불변 객체는 한 번 생성되면 상태가 변하지 않기 때문에 스레드 세이프하다.
  • 별도의 락이나 동기화 필요 없음

확실하게 스레드 세이프한 환경을 구현할 수 있는 경우 이외에는 동기화 기법을 사용한다.

profile
주니어개발자(?)

0개의 댓글