본문 바로가기
Language/Java

Java - ThreadLocal

by 밍상 2022. 7. 2.

ThreadLocal이란 자바에서 제공하는 동시성 문제를 해결하는 방법이다.

 

쉽게 생각하면 한 스레드 내에서 공유하는 전역 변수라고 할 수 있을 것 같다.

 

싱글톤으로 등록된 스프링 빈은 객체의 인스턴스가 애플리케이션에 딱 1개만 존재하게된다. 그러면 이 인스턴스의 필드를 여러 쓰레드가 동시에 접근할 때 문제가 발생할 수 있다. (읽기만 하면 문제 없음. 수정 시 문제)

 

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

-> 싱글톤 객체에서 동시 접근 가능성이 있는 필드를 쓰레드 로컬로 생성해주면 된다!

 

java.lang.ThreadLocal

//private String name; //기존 코드의 필드
private ThreadLocal<String> name = new ThreadLocal<>; //ThreadLocal 사용
    
name.set("Andy");

name.get(); //"Andy"

 

주의 사항

쓰레드 로컬의 값을 사용 후 제거하지 않고 그냥 두면 WAS(톰캣)처럼 쓰레드 풀을 사용하는 경우에 심각한 문제가 발생할 수 있다.

-> 쓰레드 풀을 사용할 경우에 쓰레드가 사용이 끝나고 반환돼도 제거되지 않기 때문에 상관 없는 데이터가 조회될 수도 있다는 문제가 발생할 수 있다.

 

이런 문제를 방지하기 위해 사용자의 요청이 끝날 때 ThreadLocal의 값을 'ThreadLocal.remove()'를 통해 꼭 제거해야 한다.

'Language > Java' 카테고리의 다른 글

Java - JSON 파싱  (0) 2023.08.03
Java - Record란?  (0) 2022.06.24
Wrapper Class vs Primitive Type  (0) 2022.03.29
Java - 스트림으로 데이터 수집  (0) 2022.03.03
Java - 스트림 활용  (0) 2022.03.03