JAVA

[JAVA] ThreadLocal

집한구석 2021. 12. 3. 23:27
728x90

동시성 문제

  • 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제
  • 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽 적은 상황에서는 확률상 잘 발생하지 않아서 해당 문제를 찾기가 힘듬

동시성 문제가 발생하는 곳은 주로 같은 인스턴스의 필드(주로 싱글톤인 인스턴스)나 static 같은 공용 필드에서 접근시 발생하며 이러한 문제를 해결해 주는것이 ThreadLocal


ThreadLocal

  • 해당 쓰레드만 접근할 수 있는 특별한 저장소를 지칭함
  • 각 쓰레드마다 별도의 내부 저장소를 제공하여 데이터를 안전하게 보관하여 동시성 문제를 해결해줌 
  • JAVA는 ThreadLocal을 지원하기 위해 java.lang.ThreadLocal 클래스를 제공함

ThreadLocal 사용법

  1. ThreadLocal 객체 생성
  2. ThreadLocal.set() 메서드를 이용하여 현재 쓰레드의 로컬 변수에 값을 저장
  3. ThreadLocal.get() 메서드를 이용하여 현재 쓰레드의 로컬 변수 값을 가져옴
  4. ThreadLocal.remove() 메서드를 이용하여 현재 쓰레드의 로컬 변수 값을 삭제 

ThreadLocal 활용

  • Spring Security에서 사용자 인증정보를 전파할 때 ThreadLocal을 사용 
  • 트랜잭션 매니저는 트랜잭션 컨텍스트를 전파하는 데 ThreadLocal을 사용
  • 쓰레드에 데이터 보관시 사용 

ThreadLocal 주의사항

  • 쓰레드 풀 환경에서 ThreadLocal을 사용하는 경우 ThreadLocal 변수에 보관된 데이터 사용이 끝나면 반드시 remove()를 진행해야하며, 그렇지 않은 경우 재사용되는 쓰레드가 올바르지 않은 데이터를 참조하게 됨, ThreadLocal 사용이 끝나면 무조건 remove() 해주자

'JAVA' 카테고리의 다른 글

[JAVA] 데코레이터 패턴  (0) 2021.12.10
[JAVA] 프록시패턴  (0) 2021.12.09
[JAVA] 템플릿 메소드 패턴  (0) 2021.11.29
[JAVA] 전략패턴  (0) 2021.11.29
[JAVA] TreeMap  (0) 2021.11.08