ThreadLocal

背景

尝试看Java源码,从TheadLocal开始,Java版本默认1.8。

用途

申明为:private static final

多线程中线程独立变量,不涉及线程间共享同步,多用于框架上下文中,减少参数传递

例:spring security中ThreadLocalSecurityContextHolderStrategy用于保存SecurityContext就使用了TheadLocal,在每次请求filter中set,在请求filter链结束后remove

源码

常用方法列表如下,具体代码看JDK
initialValue() 默认null,覆盖提供额外初始化
get() 获取值
remove() 移除值
set(T value)

原理

在这里插入图片描述
ThreadLocal提供操作一个线程局部变量的相关方法的一个类

具体变量值存于ThreadLocalMap的Entry Table[]中,key是ThreadLocal弱引用

ThreadLocalMap又由Thread持有

默认从CurrentThread中获取ThreadLocalMap

问题

  1. 为什么ThreadLocal不是工具类
    ThreadLocal是实现类成员变量线程安全的一种技术,这样设计在使用很自然,很像简单成员变量
    ,ThreadLocal封装了实现线程安全的细节,范型又可以确保了值类型

  2. 神奇数字0x61c88647
    hash碰撞避免和解决
    具体查看【拓展-散列表】

  3. 内存泄露
    在ThreadLocal的get,set的时候都会清除线程Map里所有key为null的value
    ThreadLocal对象的回收,Thread到value的强引用还在
    当Thread结束销毁后,强引用消失,value回收
    但是在Thread一直存在的场景(如线程池),如果线程一直不销毁,不再使用此线程或不再使用此线程ThreadLocal的get,set的时候,则内存泄露,这种情况还是比较少见

拓展

参考

  1. (基础系列)ThreadLocal的用法、原理和用途
  2. ThreadLocal 和神奇的数字 0x61c88647
  3. ThreadLocal可能引起的内存泄露
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值