ThreadLocal概念和使用案例

原文地址(有代码)

主要作用: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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值