Open NuhGnod opened 10 months ago
저도 이부분이 궁금하네용
기존에는 쓰레드에서 주는 문자열을 쓰레드를 구분하는 고유한 키로 사용했는데, 단순히 Key 객체만 만들면 어떻게 쓰레드를 구분하게 되는걸까요??
책에서 쓰레드 별 '고유한 키'를 만드는 코드를 생략한걸까요?
다시 보니, 말하신대로 제대로 동작하기 위한 코드는 생략해놓은것 같네요.
Java의 ThreadLocal 클래스를 확인해보니,
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value);
} else {
createMap(t, value);
}
}
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의 ThreadLocal클래스를 참고해서 다시 읽어보며 변환과정을 보니 조금 이해되더라고요
set,get 메소드 등을 간단하게 구현했습니다.
코드 62-3
public class ThreadLocal {
private static Map<Key, Object> map = new HashMap<>();
private ThreadLocal() {
}
public static class Key {
Key() {
}
public static void set(Key key, Object val) {
map.put(key, val);
}
public static Object get(Key key) {
return map.get(key);
}
}
public static Key getKey() {
return new Key();
}
}
코드 62-4
public class ThreadLocal {
private static Map<ThreadLocal, Object> map = new HashMap<>();
public ThreadLocal() {
}
public static void set(ThreadLocal key, Object val) {
map.put(key, val);
}
public static Object get(ThreadLocal key) {
return map.get(key);
}
}
main
public class Main {
public static void main(String[] args) {
ThreadLocal.Key key = ThreadLocal.getKey();
key.set(key, "HELLO");
Object o1 = key.get(key);
System.out.println("o1 = " + o1);
ThreadLocal key1 = new ThreadLocal();
key1.set(key1, "JAVA");
Object o = key1.get(key1);
System.out.println("o = " + o);
}
}
Java.lang패키지의 ThreadLocal 👍
ThreadLocal 객체 1개에 1개의 value만 살아있다. => 그 자체로 key로 사용가능하다.
p.364 코드62-4 에서 리팩토링 결과처럼 바뀌는 변환과정에 대해?
그리고 Key가 그 차제가 스레드 지역변수가 되는 이유?