主要作用:ThreadLocal 能够隔离线程间的数据共享,提供线程级别的数据存储(私有变量)
方法:
- set(T value):设置值
- T get():获取值
- remove():删除值
常用场景:
- servlet上下文(http请求对应线程)保存用户信息;
- 线程私有变量;
- 数据库连接,每个线程保存自己的连接信息;
- 实现事务管理
注意事项:
每次使用后需要显式调用remove()方法,线程池场景中,线程被反复调用情况下,设置的值无法被垃圾回收。
慎用场景:
1.线程池中线程调用使用ThreadLocal 由于线程池中对线程管理都是采用线程复用的方法。在线程池中线程非常难结束甚至于永远不会结束。意味着线程持续的时间将不可预測,甚至与JVM的生命周期一致;
2.异步程序中,ThreadLocal的參数传递是不靠谱的,由于线程将请求发送后,就不再等待远程返回结果继续向下运行,真正的返回结果得到后,处理的线程可能是其他的线程,Java8中的并发流也要考虑这种情况;
3.使用完ThreadLocal,手动调用 remove() 方法,防止出现内存溢出,因为中使用的key为ThreadLocal的弱引用,如果ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候会被清理掉的,但是如果value是强引用,不会被清理,这样一来就会出现 key 为 null 的 value。