2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[item 62] ThreadLocal #150

Open NuhGnod opened 10 months ago

NuhGnod commented 10 months ago

p.364 코드62-4 에서 리팩토링 결과처럼 바뀌는 변환과정에 대해?

그리고 Key가 그 차제가 스레드 지역변수가 되는 이유?

gmelon commented 10 months ago

저도 이부분이 궁금하네용

기존에는 쓰레드에서 주는 문자열을 쓰레드를 구분하는 고유한 키로 사용했는데, 단순히 Key 객체만 만들면 어떻게 쓰레드를 구분하게 되는걸까요??

책에서 쓰레드 별 '고유한 키'를 만드는 코드를 생략한걸까요?

NuhGnod commented 10 months ago

다시 보니, 말하신대로 제대로 동작하기 위한 코드는 생략해놓은것 같네요.

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);

    }
}
NuhGnod commented 10 months ago

Java.lang패키지의 ThreadLocal 👍

ThreadLocal 객체 1개에 1개의 value만 살아있다. => 그 자체로 key로 사용가능하다.