ThreadLocal一篇将从底层到原理讲清

ThreadLocal

1.是什么

一个存储结构,可以定义一个变量,每一个线程都可以拥有这个变量的副本,每个线程对于这个变量的修改,都只在本线程内有效,让共享变量不会出现多线程问题

ThreadLocal一篇将从底层到原理讲清_第1张图片

2.内部结构

底层由一个Entry数组构成,key的类型为弱引用,(弱引用,只能生存到下一次gc前,由次可能发生内存泄漏问题),value为set传入的值。不同的线程会有不同的threadmap,而key的值为当前threadlocal,一个线程有多个threadlocal时,就会根据不同的threadlocal对象的hash值确定不同的数组坐标。

static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
            table = new Entry[INITIAL_CAPACITY];
            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
            table[i] = new Entry(firstKey, firstValue);
            size = 1;
            setThreshold(INITIAL_CAPACITY);
        }

3,内存泄漏

因为threadlocal中存储值的Entry数组中的key的类型为弱引用,而弱引用根据虚拟机规则,在垃圾回收时会直接回收,当前线程还存在时,导致数组中一个元素的key为null,而value不为null,get方法也无法访问到,业绩导致了内存泄漏(这个值无法使用也没有回收)。

你可能感兴趣的:(java基础学习)