본문 바로가기
카테고리 없음

[Java] ThreadLocal 이용하기

by 제제킴 2020. 4. 26.
반응형

ThreadLocal 이란?

 

ThreadLocal 는 하나의 쓰레드에 의해 읽고 쓸 수 있는 변수를 생성한다. 

만약 두개의 쓰레드가 같은 코드를 실행한다면 각각의 쓰레드들은 서로의 ThreadLocal 변수를 확인할 수 없다.

Thread 단위 Local 변수를 할당하는 기능이다.

 

ThreadLocal 클래스는 thread-local 변수들을 제공한다. 이 변수들은 get 또는 set 메소드를 통해 접근하는 각 스레드가 독립적으로 변수의 초기화 된 사본을 가지고 있다는 점에서 다르다. ThreadLocal 인스턴스들은 보통 스레드와 상태를 연결하려고 하는 클래스들의 private static 필드들이다. (예를들어, 유저 ID 또는 트랜잭션 ID)  (참고- 오라클 Docs)

 

https://docs.microsoft.com/ko-kr/windows/win32/procthread/thread-local-storage?redirectedfrom=MSDN

// 쓰레드 로컬 선언
ThreadLocal<String> local = new ThreadLocal<String>();

쓰레드 로컬은 여러 Thread에서 각자의 값을 가질 수 있다.

그렇기 때문에 Thread1 과 Thread2의 값이 다르게 나타난다.

 

// ThreadLocal 현재 쓰레드의 값을 저장
local.set("First");

// 현재 쓰레드의 값을 호출
local.get();

 

ThreadLocal 사용

- 사용자 고유값(인증값) 으로 활용 - ThreadLocal을 이용해서 사용자 key을 갱신 및 전달한다. 

- 트랜잭션 매니저에서 transaction Context를 전파하는데 사용.

 

 

https://www.red-gate.com/simple-talk/blogs/subterranean-il-threadlocal-revisited/

 

주의할점

지금 내가 서비스하는 곳에선 해당 ThreadLocal을 통해 고객 Session을 유지하고있다.

 

세션이 만료되지 않고 잘 유지되고 있다면 기존 Session을 각 Thread에서 동일한 값을 가지고 있을 것이다.

다만, 세션이 만료되어 재갱신이 필요한 Case가 존재한다.

그럴때는 ThreadLocal의 값을 초기화 시켜주는 과정이 필요하다. 초기화 하지 않는다면, 비동기 호출시 각 Thread들은 많은 세션값들을 생성하게 된다. (만료된 ket를 가지고 있으니.. 값은 전역이 아니라 공유가 안됌.)

(아니면 세션을 갱신시키는 API를 동기화 시켜 첫 호출이 완료된 후 세션 갱신이 이루어졌으면 그 값으로 재통신을 이루어지는 로직을 타야된다.)

 

반응형

댓글