本文主要是介绍Java 多线程关键字 ThreadLocal 学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
基于 JDK 1.8
概述
ThreadLocal,顾名思义线程本地变量,即每个线程的内部,都有存有这个变量的副本,多个线程之间不可见,从而避免了对共享变量的操作,而造成的并发问题。
本文先对 ThreadLocal 进行全局的了解,ThreadLocalMap 的源码放到后面的文章中进行分析学习。
- 使用
通过 set 方法赋值,或者初始化的时候重写 initialValue 方法
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){@Overrideprotected 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
这篇关于Java 多线程关键字 ThreadLocal 学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!