상세 컨텐츠

본문 제목

[스프링] 동시성 문제, ThreadLocal

😎 지식/자바_스프링_테스트☕

by :부셔져버린개발자 2024. 11. 25. 12:24

본문

싱글톤으로 등록된 FieldLogTrace 빈에서 인스턴스의 필드, 또는 static 같은 공용 필드에 동시에 접근할 때 발생

 

테스트 코드 예시

public class FieldServiceTest {
    private FieldService fieldService = new FieldService();
    @Test
    void field() {
        log.info("main start");
        Runnable userA = () -> {
            fieldService.logic("userA");
        };
        Runnable userB = () -> {
            fieldService.logic("userB");
        };
        Thread threadA = new Thread(userA);
        threadA.setName("thread-A");
        Thread threadB = new Thread(userB);
        threadB.setName("thread-B");
        
        threadA.start();
        sleep(100);
        
        threadB.start();
        sleep(3000);
        
        log.info("main exit");
    }
}

 

 

ThreadLocal

각 쓰레드마다 별도의 내부 저장소 제공

같은 인스턴스의 쓰레드 로컬 필드에 접근해도 문제 없음

public class ThreadLocalService {
    private ThreadLocal<String> nameStore = new ThreadLocal<>();
    
    public String logic(String name){
        log.info("저장 name={} -> nameStore={}", name, nameStore.get());
        nameStore.set(name);
        sleep(1000);
        log.info("조회 nameStore={}", nameStore.get());
        return nameStore.get();
    }

}

 

 

WAS의 쓰레드 풀에서 thread-A는 살아있다 

따라서, 사용자 A요청이 끝날 때 쓰레드 로컬의 값을 ThreadLocal.remove()를 통해 제거해야 한다

728x90

관련글 더보기