[JAVA] Thread Safe란?

[JAVA] Thread Safe란?

Thread Safe는 Multi Thread 프로그래밍에서 중요한 개념으로, 여러 Thread가 동시에 접근하더라도 함수나 변수, 객체가 올바르게 동작하는 것을 의미한다.

예를 들어, 하나의 함수가 한Thread에 의해 호출되어 실행 중일 때, 다른 Thread가 그 함수를 호출하여 동시에 실행하더라도 각 Thread에서의 함수 수행 결과가 올바르게 나와야 한다.

Thread Safe를 보장하는 방법

1. 상호 배제(Mutual Exclusion)

상호 배제는 공유 자원에 대한 접근을 제어하여 동시에 여러 Thread가 접근하지 못하도록 하는 방법이다. 이를 위해 락(lock)이나 세마포어(semaphore)와 같은 동기화 메커니즘이 사용된다.

public final class ImmutableCounter {
    private final int count;

    public ImmutableCounter(int count) {
        this.count = count;
    }

    public ImmutableCounter increment() {
        return new ImmutableCounter(this.count + 1);
    }

    public int getCount() {
        return count;
    }
}

2. 원자 연산(Atomic Operations)

원자 연산은 중단되지 않고 한 번에 실행되는 연산을 의미한다.
이를 통해 여러 Thread가 동시에 접근하더라도 데이터의 일관성을 유지할 수 있다.

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicCounter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

3. 쓰레드 로컬 저장소(Thread Local Storage)

공유 자원을 사용하지 않고, 각 Thread가 독립적으로 데이터를 저장하고 접근할 수 있도록 하는 방법이다.

public class ThreadLocalExample {
    private static final ThreadLocal<Integer> threadLocalCount = ThreadLocal.withInitial(() -> 0);

    public void increment() {
        threadLocalCount.set(threadLocalCount.get() + 1);
    }

    public int getCount() {
        return threadLocalCount.get();
    }
}

4. 불변 객체(Immutable Objects)

불변 객체는 생성된 후 상태를 변경할 수 없는 객체를 의미한다. 상태 변경이 안되므로 여러 Thread가 접근하더라도 Thread Safe하다.

public final class ImmutableCounter {
    private final int count;

    public ImmutableCounter(int count) {
        this.count = count;
    }

    public ImmutableCounter increment() {
        return new ImmutableCounter(this.count + 1);
    }

    public int getCount() {
        return count;
    }
}

참조

스레드 안전 - 위키백과, 우리 모두의 백과사전