매우 간단하게.. '쓰레드 당 데이터 저장소' 라고 할 수 있겠습니다.

즉, 각각의 Thread에서 사용하는 객체들을 저장해둔 곳으로 이해할 수 있습니다. 먼저 어떻게 생겼는지 살펴보겠습니다.
사용자 삽입 이미지
딱 네 개의 메소드로 구성되어 있습니다. 이 중에서 remove()는 1.5부터 추가 되었고 나머지는 1.2부터 있었습니다.

get()은 현재 쓰레드가 사용하는 변수의 값을 가져오고,
set(T value)는 현재 쓰레드가 사용하고 있는 변수의 복사본을 저장해 둡니다.
initialValue()는 get()을 호출 했을 때, 해당 쓰레드에 대해 저장되어 있는 값이 없을 때 호출이 되며, 보통은 쓰레드에서 딱 한번만 호출이 되지만 remove()를 호출한 다음 get()을 할 경우 여러번 호출 될 수도 있습니다.

아직도 잘 이해가 가지 않습니다. 지금 여기까지 봐서는 Collection 스러운 분위기만 풍길 뿐 뭔지 모르겠습니다. 그래서 구현된 클래스를 살펴보겠습니다.

public class ThreadLocal<T> {
    ...
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

    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 void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null)
             m.remove(this);
     }

    protected T initialValue() {
        return null;
    }
    ...
}

사용자 삽입 이미지내부적으로 ThreadLocalMap 이라는 static inner 클래스를 사용하고 있습니다. 이 Map을 사용하여 각 Thread 당 데이터를 저장하고 그곳에서 데이터를 주는 일을 하고 있습니다. 더 자세히 살펴보기는;; 무리라서 일단 여기에서 잠시 쉬었다 가겠습니다.