I、java.lang.ThreadLocal
1、定义:ThreadLocal:线程局部变量,它通常是私有类中希望将状态与线程关联的静态字段。ThreadLocal提供了线程间数据隔离的功能,每个线程都会在ThreadLocal中保存一份该线程独有的数据,所以它是线程安全的。
2、数据结构:静态内部类ThreadLocalMap。ThreadLocalMap: 一个键值对Map,底层是Entry 对象数组,Entry对象中键是ThreadLocal对象,值是Object类型的具体存储内容。
文章图片
3、api:
文章图片
get:get当前线程中存储的数据;
public T get() {// 获取当前线程
Thread t = Thread.currentThread();
// 查找对应线程的ThreadLocalMap变量
ThreadLocalMap map = getMap(t);
if (map != null) {// 不为null,返回当前threadLocal 对应的value值ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
} // 当前线程的threadLocalMap为空,初始化
return setInitialValue();
}
private T setInitialValue() { // 初始化的值为null
T value = https://www.it610.com/article/initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else// 初始化当前线程的threadLocalMapcreateMap(t, value);
return value;
}
protected T initialValue() {
return null;
}
【ThreadLocal】set:往当前线程中set数据;
public void set(T value) {// 获取当前线程
Thread t = Thread.currentThread();
// 去查找对应线程的ThreadLocalMap变量
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else // 第一次调用就创建当前线程的对应的ThreadLocalMap
// 并且会将值保存进去,key是当前的threadLocal,value就是传进来的值
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
remove:清空线程中的数据。
4、局限性:
ThreadLocal在线程池场景容易导致内存溢出(线程池复用线程)
无法实现父子线程信息传递
II、java.lang.InheritableThreadLocal III、com.alibaba.ttl.TransmittableThreadLocal
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)