为每个线程都创建一个独立变量,做到了线程隔离。
每个线程都有一个 ThreadLocalMap 实例:ThreadLocal.ThreadLocalMap threadLocals = null;
ThreadLocalMap 是一个哈希表,key 为 ThreadLocal 类型的引用(弱引用),value 为实际放入的值。
在往 ThreadLocal 对象里塞值的时候,其实就是向当前线程的 ThreadLocalMap 对象里面塞值,key 就是此 ThreadLocal 对象的弱引用。
不同于 HashMap,ThreadLocalMap 处理哈希冲突采用的是线性探测法。
上面已经提到,这个哈希表的 key 是弱引用,特定情况下,JVM 会使其失效,即对 key 代表的元素做了删除标记。
在 set、get、remove 方法中,都会涉及到清理操作来删除被标记的元素。