- [Java 정리] ThreadLocal2022년 10월 19일
- starryeye
- 작성자
- 2022.10.19.:22
java.lang.ThreadLocal 에 대해 알아보자.
쓰레드 로컬은..
자바에서..
싱글톤 객체의 필드를 사용하면서, 동시성 문제를 해결하는 방법이다.
각 쓰레드마다 별도의 내부 저장소를 제공하여,
동일한 인스턴스의 로컬 필드에 각 쓰레드가 접근해도 동시성 문제가 없다.
예시를 보며.. 알아보자.
ThreadLocalService라는 클래스는 아래 ThreadLocalServiceTest 클래스에서
하나의 인스턴스로 두개의 쓰레드에서 사용된다.
ThreadLocal의 String 타입으로 nameStore를 정의하였다.
set메서드와 get 메서드 사이 간격은 1초간격이다.
ThreadLocal 클래스는 다음과 같은 메서드를 제공한다...
ThreadLocal.set(...) : 값 저장에 사용
ThreadLocal.get() : 값 조회에 사용
ThreadLocal.remove() : 값 제거에 사용
앞서 개발한 ThreadLocalService 객체를 사용하는 ThreadLocalServiceTest 클래스이다.
Runnable 인터페이스를 람다식으로 구현하였다. (run 메서드)
ThreadLocalService의 logic 함수를 호출 하는데 넘겨주는 String값을 각기 다르게 하였다. (18 ~ 24 line)
Runnable 구현체를 각 쓰레드 이름을 부여하며, 두개의 쓰레드로 생성하였다.
(26 ~ 29 line)
두 쓰레드를 0.1초간격으로 실행 하였다. (31 ~ 33 line)
-> ThreadLocal 변수로 개발했기 때문에 동시성 문제는 발생되지 않는다..
-> Thread-A는 userA로 정상 조회, Thread-B는 userB로 정상 조회.
하지만..
ThreadLocal 변수가 아니라 일반 String 변수로 했다면..
-> 0.1초간격으로 실행하였기 때문에 ThreadLocal 변수가 아니면, 동시성 문제가 발생한다.
-> ThreadLocal 변수가 아니면, Thread-A의 조회 로그에서 userB라고 출력된다.
(ThreadLocalService의 logic 함수 내부 set, get 간격이 1초이다.)
주의 사항
쓰레드 풀을 사용할 경우 주의 사항이 있다.
쓰레드 풀은 쓰레드가 사용되고 삭제되지 않고 쓰레드 풀에 반환되고..
다음에 쓰레드가 필요할 경우.. 재사용된다.
여기서 문제가 발생된다.
기존에 쓰레드로컬 변수를 한번 사용했던 쓰레드라면..
쓰레드가 반환되고 재사용 되는 시점에... 쓰레드 로컬 변수에 값이 살아있기 때문에
의도하지 않은 문제가 발생될 수 있다.
따라서..
쓰레드를 반환하기 직전에는
쓰레드 로컬 변수의 값을 반드시 삭제하고 반환해야한다.
(ThreadLocal.remove() 사용)
추후 포스팅 예정..
-> ThreadLocal 동작 원리..
'Java' 카테고리의 다른 글
불변 객체 validation (1) 2023.05.07 불변 객체, lombok @Value 와 Java Record (0) 2023.05.07 [Java 정리] Thread 6 (0) 2022.08.22 [Java 정리] Thread 5 (0) 2022.08.22 [Java 정리] Thread 4 (0) 2022.08.22 다음글이전글이전 글이 없습니다.댓글