ThreadLocal源码解析

橙三吉。 提交于 2020-01-23 14:29:04

JDK源码如是说:

ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时
能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,
用于关联线程和线程的上下文。
 

1、内部存储元素采用ThreadLocalMap,其内部

  1.1、Entry继承WeakReference<ThreadLocal<?>>,

    方便垃圾回收key。每次get()——>getEntry()——>getEntryAfterMiss——>expungeStaleEntry删除key为null的值。

  1.2、使用ThreadLocal作为key,减少Entry的key数量,提高性能。

2、使用时,继承

protected T initialValue() {
return null;
}

添加需要返回的对象。

建议将ThreadLocal变量定义成private static的,这样的话ThreadLocal的生命周期就更长,由于一直存在ThreadLocal的强引用,所以ThreadLocal也就不会被回收,也就能保证任何时候都能根据ThreadLocal的弱引用访问到Entry的value值,然后remove它,防止内存泄露。

ps:ThreadLocal中对象只是当前线程存储在map中的副本。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!