Java 多线程关键字 ThreadLocal 学习

本文深入探讨Java的ThreadLocal关键字,解析其如何为每个线程提供独立的变量副本,避免并发冲突。通过分析ThreadLocal的成员变量、set和get方法,以及其在线程池中的应用,揭示弱引用在防止内存泄漏中的作用,并建议将ThreadLocal声明为static以优化内存使用。
摘要由CSDN通过智能技术生成

基于 JDK 1.8

概述

ThreadLocal,顾名思义线程本地变量,即每个线程的内部,都有存有这个变量的副本,多个线程之间不可见,从而避免了对共享变量的操作,而造成的并发问题。

本文先对 ThreadLocal 进行全局的了解,ThreadLocalMap 的源码放到后面的文章中进行分析学习。

  • 使用

通过 set 方法赋值,或者初始化的时候重写 initialValue 方法

private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){
   
    @Override
    protected Integer initialValue() {
   
        return 1;
    }
};

ThreadLocal 源码分析

在这里插入图片描述

  • 每个 Thread 对象里面包含一个 ThreadLocal.ThreadLocalMap 属性,所以不同线程的这个 ThreadLocalMap 属性互不可见
  • 每个线程的 ThreadLocalMap 互相不可见,因为这是线程自己的属性
  • ThreadLocalMap 里面包含多个 Entry,Entry 的 key 通过弱引用指向 ThreadLocal 对象,value 为初始化设定的值

成员变量

threadLocalHashCode 用于表示 ThreadLocal 对象对应的 hash 值,每创建一个 ThreadLocal 对象,该对象的 threadLocalHashCode 值就会累加 HASH_INCREMENT 。

0x61c88647对应十进制=1640531527,(根号5-1)*2的31次方,转换成long类型就是2654435769,转换成int类型就是-1640531527,可见 HASH_INCREMENT 与黄金分割比例相关,这样的实现方式能够形成较好的散列效果。

文档中解释到这种计算散列值的方式很特殊,仅在 ThreadLocalMaps 中使用效果比较好。


private final int threadLocalHashCode = nextHashCode();

private static AtomicInteger nextHashCode = new AtomicInteger();

private static final int HASH_INCREMENT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值