2021-11-08

认识ThreadLocal

此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个(通过其 get 或 set 方法)的线程都有自己的、独立初始化的变量副本。 ThreadLocal 实例通常希望是那些将状态与线程相关联的类中的私有静态字段(例如,用户 ID 或事务 ID)。
例如,下面的类生成每个线程本地的唯一标识符。线程的 id 在第一次调用 ThreadId.get() 时被分配,并且在后续调用中保持不变。
导入 java.util.concurrent.atomic.AtomicInteger;
公共类线程 ID {
// 包含要分配的下一个线程 ID 的原子整数
private static final AtomicInteger nextId = new AtomicInteger(0);
// 包含每个线程 ID 的线程局部变量
私有静态最终 ThreadLocal threadId =
新线程本地<整数>(){
@Override 受保护的整数 initialValue() {
返回 nextId.getAndIncrement();
}
};
// 返回当前线程的唯一 ID,必要时分配它
公共静态 int get() {
返回 threadId.get();
}
}
只要线程处于活动状态并且可以访问 ThreadLocal 实例,每个线程都会持有对其线程局部变量副本的隐式引用;线程消失后,它的所有线程本地实例副本都将进行垃圾回收(除非存在对这些副本的其他引用)。

public class ThreadLocal<T>{
ThreadLocals 依赖于附加到每个线程(Thread.threadLocals 和inheritableThreadLocals)的每线程线性探针哈希映射。 ThreadLocal 对象充当键,通过 threadLocalHashCode 进行搜索。 这是一个自定义哈希代码(仅在 ThreadLocalMaps 中有用),它消除了在相同线程使用连续构造的 ThreadLocals 的常见情况下的冲突,同时在不太常见的情况下保持良好的行为。
private final int threadLocalHashCode = nextHashCode();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值