ThreadLocal概念
ThreadLocal 提供线程本地变量,每个线程可以通过get()和set()方法对变量进行操作,它可以确保访问的变量属于当前线程,线程之间不会冲突,实现了线程数据的隔离。
ThreadLocal<Integer> local = new ThreadLocal<Integer>();
local.set(6);
local.get();
复制代码
ThreadLocal 源码解析
- set方法
- get方法
get方法同样通过Thread.currentThread()获取当前线程,并通过getMap返回了Thread实例的成员变量threadLocals,从而获取线程变量。当threadLocals为空时,通过setInitialValue方法,默认返回为null。
- ThreadLocalMap ThreadLocalMap是ThreadLocal的一个静态内部类。ThreadLocalMap中,初始化了一个大小为16的entry数组,entry继承自WeakReference, 用来保存key-value。
private final int threadLocalHashCode = nextHashCode()
private static final int HASH_INCREMENT = 0x61c88647;
private static int nextHashCode() {
return nextHashCode.getAndAdd(HASH_INCREMENT);
}
复制代码
内存泄漏
ThreadLocalMap的实现中,key被保存到了WeakReference对象中。 ThreadLocal在没有外部强引用时,发生GC时会被回收,如果创建ThreadLocal的线程一直持续运行,那么这个Entry对象中的value就有可能一直得不到回收,发生内存泄露。 如果使用ThreadLocal的set方法之后,没有显示的调用remove方法,就有可能发生内存泄露,所以养成良好的编程习惯十分重要,使用完ThreadLocal之后,记得调用remove方法