[Java] ThreadLocal
```java
class User { }
public class ThreadLocalTest {
public static void main(String[] args) {
User u = new User();
ThreadLocal threadLocal = new ThreadLocal<>();
threadLocal.set(u);
System.out.println(threadLocal);
System.out.println(threadLocal.get());
new Thread(()->{
System.out.println(threadLocal);
System.out.println(threadLocal.get());
}).start();
new Thread(()->{
threadLocal.set(u);
System.out.println(threadLocal);
System.out.println(threadLocal.get());
}).start();
}
}
```
```
java.lang.ThreadLocal@63947c6b
User@2b193f2d
java.lang.ThreadLocal@63947c6b
null
java.lang.ThreadLocal@63947c6b
User@2b193f2d
```
- `` threadLocal``이라는 변수는 안에 컨테이너를 들고 있는데, 이 컨테이너가 스레드마다 독립적으로 존재한다!
- `` threadLocal`` 이라는 변수 자체는 각 스레드에서 조회해도 동일한 변수임
- 그 안의 컨테이너를 `` .get()``으로 가져왔을 때, 각 스레드마다 호출 결과가 다르다. 두 번째 스레드가 print한거 보면 `` null``임
- 단, 세번째 스레드 처럼 `` threadLocal`` 내 컨테이너에 같은 변수를 설정하게 되면, 컨테이너 자체는 독립적이지만 컨테이너가 가리키는 변수가 같아지므로 각 스레드에서 같은 변수에 접근하게 된다.
ThreadLocal 내부 동작?
- 자신 thread를 key로 하여 ThreadLocalmap을 가져오는 식으로 동작함
```java
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
```
'Java Stack > Java' 카테고리의 다른 글
[Effective Java] 10장 예외 (0) | 2020.02.27 |
---|---|
[Effective Java] 9장 일반적인 프로그래밍 원칙 [TIP : String 비교, 문자열 포매팅] (0) | 2020.02.26 |
[Effective Java] 8장 메서드 ( null 체크, Optional ) (2) | 2020.02.22 |
[Effective Java] 7장 람다와 스트림 (0) | 2020.02.16 |
[Effective Java] 6장 enum 타입과 애너테이션 (Annotation) (0) | 2019.12.31 |