JAVA/Spring

쓰레드로컬 Thread Local (데이터 경합 방지)

호두밥 2023. 7. 8. 20:26

정의

쓰레드별 데이터를 보관하는 전용보관소, 쓰레드별 데이터 경합을 방지해준다. 

사용법

// 값 선언
ThreadLocal<Integer> threadLocalValue = new ThreadLocal<>(); 
// 값 저장
threadLocalValue.set(1);
// 값 조회
threadLocalValue.get();
// 값 제거
threadLocalValue.remove();

예시

// 쓰레드 로컬을 사용하는 서비스 만들기
public class ThreadLocalService {

	private ThreadLocal<String> context = new ThreadLocal<>();
    
    public String begin(String value) {
    	context.set(value)
    	return context.get();
    }
    
    public void end(){
    	context.remove();
    }
}

// 쓰레드 로컬 실행하기
private ThreadLocalService service = new ThreadLocalService();

String service1 = service.begin("hello1");
service.end();

주의사항

쓰레드 로컬을 사용하고 나면, remove()를 이용해 값일 지워야 메모리 누수가 발생하지 않는다.

특히 쓰레드풀을 사용할 때 문제가 된다. WAS에서 사용된 쓰레드를 쓰레드풀에 반환하고, 다른 쓰레드가 재사용한다. 

이때, 쓰레드 로컬에 데이터가 남아있다면 영향을 받을 수 있다. 

'JAVA > Spring' 카테고리의 다른 글

@RequestMapping 과 @Controller  (0) 2022.01.26
Spring MVC 구조  (0) 2022.01.23
스프링 빈과 의존성 주입 (DI)  (0) 2022.01.12