ThreadLocal解析

简介: ThreadLocalThreadLocal 中有一个静态内部类 ThreadLocalMap,ThreadLocalMap 维护一个 Entry 数组,大小为 16,Entry 以弱引用的 ThreadLocal 作为 key,value 就是我们要设置的值。

ThreadLocal
ThreadLocal 中有一个静态内部类 ThreadLocalMap,ThreadLocalMap 维护一个 Entry 数组,大小为 16,Entry 以弱引用的 ThreadLocal 作为 key,value 就是我们要设置的值。在 Thread 内部维护一个 ThreadLocalMap 的变量,也就是说每个线程都有一个 ThreadLocalMap 的变量,互相之间不干扰,当我们需要使用线程局部变量时,就以 ThreadLocal 对象作为 key,以存储的值作为变量,放入当前线程的ThreadLocalMap 中。
ThreadLocal 的方法:

public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;}
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}

ThreadLocalMap 的回收:
当 线 程 死 亡 时 , 那 么 所 有 的 保 存 在 的 线 程 局 部 变 量 就 会 被 回 收 , 其 实 这 里 是 指 线 程 Thread 对 象 中 的ThreadLocal.ThreadLocalMap threadLocals 会被回收。
如果线程可以活很长的时间,并且该线程保存的线程局部变量有很多(也就是 Entry 对象很多),那么就涉及到在线程的生命期内如何回收 ThreadLocalMap 的内存了。 Entry 对象的 key 是 WeakReference 的包装,当 ThreadLocalMap 的private Entry[] table,已经被占用达到了三分之二时 threshold = 2/3(也就是线程拥有的局部变量超过了 10 个) ,就会尝试回收 Entry 对象

具体如何实现的可以看这篇:

https://blog.csdn.net/huachao1001/article/details/51734973

目录
相关文章
|
4月前
|
存储 Java 中间件
《吊打面试官系列》从源码全面解析 ThreadLocal 关键字的来龙去脉
《吊打面试官系列》从源码全面解析 ThreadLocal 关键字的来龙去脉
|
1月前
|
缓存 前端开发 Java
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
34 1
|
8月前
|
Java
ThreadLocal全面解析
ThreadLocal全面解析
74 0
|
4月前
|
存储 Java 数据库连接
ThreadLocal的原理解析以及应用场景分析
ThreadLocal的原理解析以及应用场景分析 什么是ThreadLocal? ThreadLocal是Java中的一个线程管理工具,用于保证线程间数据的独立性。每个ThreadLocal对象可以存储一个线程局部变量,即对于同一个ThreadLocal对象,每个线程都有自己独立的变量。
|
9月前
|
存储 Java 数据安全/隐私保护
ThreadLocal的实现原理&源码解析
ThreadLocal是Java中的一个线程封闭机制,它提供了一种线程局部变量的解决方案,可以使每个线程都拥有自己独立的变量副本,互不干扰。
67 0
|
存储 算法 Java
ThreadLocal原理解析
ThreadLocal原理解析
78 1
ThreadLocal原理解析
|
存储 Java 索引
ThreadLocal原理解析(2):ThreadLocalMap源码解析
ThreadLocal原理解析(2):ThreadLocalMap源码解析
|
存储 Java Android开发
ThreadLocal原理解析(1):数据存取
ThreadLocal原理解析(1):数据存取
ThreadLocal原理解析(1):数据存取
|
存储 Java
ThreadLocal的使用及原理解析
JDK的lang包下提供了ThreadLocal类,我们可以使用它创建一个线程变量,线程变量的作用域仅在于此线程内
103 0
|
存储 安全 Java
ThreadLocal解析
JDK1.2 就这样了 ThreadLocal 为解决多种难题提供了一个新的思路; ThreadLocal的目的是为了解决多线程访问资源时的共享问题。 这原来是搜索到的线程本地的故事都是这样写的。 ,谎言说下去就形成了真理。 但在JDK文档里面
87 0
ThreadLocal解析

推荐镜像

更多