JVM의 Thread들은 Heap에 있는 객체들을 공유한다. Stakc에는 지역변수들이 저장되고, 이 변수들은 메서드가 호출될 때 생성되고 나갈 때 소멸되는 특징이 있다.
그렇기 때문에 Stack에 있는 변수들은 Thread-Safe 하다는 장점이 있다. 하지만 다른 메서드와 변수를 공유하기 위해서는 메서드의 파라미터로 받아야만 하고, 자신의 변수를 공유하기 위해서는 변수를 반환해줘야만 한다는 단점이 있다.
ThreadLocal
은 이런 단점을 보완하기 위해 사용한다.
ThreadLocal
은 파라미터 형태의 변수 공유가 아닌 다른 형태를 제공한다. 하나의 Thread 안에서 변수를 공유할 수 있게 해준다.
ThreadLocal
은 Thread
의 정보를 key로 Map의 형태로 저장하는 자료구조가 있다. 그래서 만약 ThreadPool
의 환경에서 Thread
를 재활용 한다면 ThreaLocal
에는 원치 않는 값이 들어있을 수 있다. 그렇기 때문에 사용 후 항상 remove()
를 호출해 값을 제거해줘야 한다.