동시성 문제

Haechan Kim·2024년 3월 5일
0

Spring

목록 보기
63/68

동시성 문제 (Concurrency Issue)

여러 스레드가 동시에 같은 인스턴스 필드에 접근시 발생하고, 트래픽 많을 시 주의해야 함.
스프링은 싱글톤으로 스프링 빈을 등록하기 때문에 동시성 문제를 조심해야 한다.

재고 관리, 금융 업무 처럼 여러 스레드에서 공용 필드 값 변경이 빈번할 때 주의해야 하는 문제!

ThreadLocal

java.lang.ThreadLocal
스레드 로컬은 해당 스레드만 접근할 수 있는 특별한 저장소.
여러 사람이 같은 창고를 사용해도, 창구 직원이 사용자를 인식해 자기 물건만 가져갈 수 있는 것과 같은 방식.

스레드 로컬 사용하지 않을 때 -> 여러 스레드 같은 필드 접근하면? 동시성 문제 발생.

스레드 로컬을 사용하면 각 스레드마다 내부 저장소 제공 -> 같은 인스턴스의 스레드 로컬 필드에 접근해도 문제 없음.

동시성 문제가 발생하는 공용 필드의 타입을 ThreadLocal<T>로 변경.

private ThreadLocal<String> stock = new ThreadLocal<>(); 
stock.set(100);
return stock.get();

ThreadLocal 동작 원리

ThreadLocal 클래스는 set() 사용 시 Thread 클래스의 변수에 ThreadLocalMap 타입 값을 할당.

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}

public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

private T setInitialValue() {
    T value = initialValue();
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
    return value;
}

ThreadLocal 사용 후에는 ThreadLocal.remove()를 호출해 저장된 값을 제거해야 함.
WAS는 사용 끝난 스레드를 스레드 풀에 반납하고 다음 요청에 다시 꺼내 재사용 하는데, 제거하지 않으면 그대로 남아있음.

Synchronized

자바의 Synchronized
하나의 프로세스가 진행될 때 다른 프로세스가 간섭하지 못하게 막음 (동시 접근 허용 x)

메소드 호출부터 영역 내 모든 객체에 lock 걸어 작업 수행하고 종료 시 lock 반환

public synchronized void method() {
...

BUT, Synchronized는 하나의 프로세스 안에서만 보장됨.
서버를 여러대 사용해 인스턴스가 여러개 존재하면 다른 방법을 사용해야 한다.

DB 락 등등

<참고>
synchronized와 db 락, Redis : https://thalals.tistory.com/370
https://ksh-coding.tistory.com/125

https://hstory0208.tistory.com/entry/Spring-동시성-문제와-해결-쓰레드-로컬

ThreadLocal : https://dev-cool.tistory.com/29
Synchronized : https://dev-cool.tistory.com/5

Th와 Syn : https://velog.io/@maketheworldwise/ThreadLocal은-뭘까

Th와 Syn : https://velog.io/@eunsiver/Synchronized

두개 비교 영어 : https://medium.com/@madamovic.bg/thread-synchronization-and-threadlocal-in-java-7e8fa19fa2c8

0개의 댓글