ThreadLoal

1. ThreadLocalMap

功能:负责保存数据。
实现:由Entry[] 数组实现。根据ThreadLoal实例计算下标。
声明位置:在Thread中声明ThreadLocalMap类型的threadLocals实例变量。

public class Thread implements Runnable {
    ThreadLocal.ThreadLocalMap threadLocals;
}

2. ThreadLoal 是什么?

ThreadLocal实例是当前线程Thread中属性threadLocals的管理者。

3. ThreadLocal的原理

ThreadLocal实例的查询操作是 根据自身实例去当前线程Thread的threadLocals属性去查询。
新增、删除也是如此。

4. 使用场景

全局存储用户信息、解决线程安全问题

在Spring的Web项目中,我们通常会将业务分为Controller层,Service层,Dao层, 我们都知道 @Autowired注解默认使用单例模式 ,那么不同请求线程进来之后,由于Dao层使用单例,那么负责数据库连接的Connection也只有一个, 如果每个请求线程都去连接数据库,那么就会造成线程不安全的问题,Spring是如何解决这个问题的呢?

在Spring项目中Dao层中装配的Connection肯定是线程安全的,其解决方案就是采用ThreadLocal方法,当每个请求线程使用Connection的时候, 都会从ThreadLocal获取一次,如果为null,说明没有进行过数据库连接,连接后存入ThreadLocal中,如此一来,每一个请求线程都保存有一份自己的Connection。于是便解决了线程安全问题

5. ThreadLocal 内存泄漏

java.lang.ThreadLocal.ThreadLocalMap.Entrykey为弱引用。

static class Entry extends WeakReference<ThreadLocal<?>> {  
    /** The value associated with this ThreadLocal. */  
    Object value;  
    Entry(ThreadLocal<?> k, Object v) {  
        super(k);  
        value = v;  
    }  
}

ThreadLocal在没有外部强引用时,发生 GC 时会被回收,那么 ThreadLocalMap 中保存的 key 值就变成了 null。
而 Entry 又被 threadLocalMap 对象引用,threadLocalMap 对象又被 Thread 对象所引用,那么线程一直不结束,value对象则会一直存在于内存中,也就导致了内存泄漏,直至 Thread被销毁后,才会被回收。

6. ThreadLocal 如何避免内存泄漏

threadLocal.remove()
使用完ThreadLocal ,最好手动调用 remove() 方法,防止出现内存溢出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码鹿的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值