ThreadLocal

ThreadLocal,泛型类。顾名思义,线程本地变量,其在定义一个全局变量时,不同的线程可以get获取不同的结果。

内存结构

threadlocal

原理:ThreadLocal对象本身其实不存储内容,而是Thread对象有个ThreadLocalMap类型的变量threadLocals来进行存储,ThreadLocal作为这个mapkey,运行get方法,实际是map.get(threadlocal)

ThreadLocalMap是采用了数组的存储结构,每个元素就是entry本身。

注意:线程池与ThreadLocal配合使用的时候,一定注意线程是回收的,Thread对象还在,因而ThreadLocalMap还在,因而里面的key-value都没有被销毁。这样轻则是引起内存泄漏,一直没有清理这部分内容。严重的则会因为再次get到线程上一世的内容,导致错误。

所以如果threadlocal不再使用了,一定记得及时remove掉,防止不必要的麻烦。

ThreadLocalMap为什么设计成弱引用

static class ThreadLocalMap {
    static class Entry extends WeakReference<ThreadLocal<?>> {
        /** The value associated with this ThreadLocal. */
        Object value;
        Entry(ThreadLocal<?> k, Object v) {
            super(k);
            value = v;
        }     
}

如果我们的代码中不需要 ThreadLocal 这个对象的话,即 ThreadLocal = null。但是 ThreadLocalMap 是线程的变量,如果线程一直运行,那么 ThreadLocalMap 永远不会为 null。

如果使用强引用,Entry 中的 k 强引用了 ThreadLocal,ThreadLocal 永远不能释放

如果使用弱引用,ThreadLocal 在垃圾回收时将释放,Entry 中的 k 将变为 null

常用方法get(),set(),remove()

源码阅读待更新 ing....