当前位置:网站首页>ThreadLocal详解
ThreadLocal详解
2022-07-06 14:53:00 【菜鸟小窝】
一、ThreadLocal
1、说明
ThreadLocal 是一个线程局部变量。其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
2、使用方法
ThreadLocal<String> nameThreadLocal = new ThreadLocal<>();
nameThreadLocal.set(name);
nameThreadLocal.get();
3、Request 使用案例
在springMvc
中单例controller
中定义成员变量 request
,使用@autowired
注入时,request
就是使用ThreadLocal
实现线程安全的。
- 在controller中注入的request是jdk动态代理对象,ObjectFactoryDelegatingInvocationHandler的实例.当我们调用成员域request的方法的时候其实是调用了objectFactory的getObject()对象的相关方法.这里的objectFactory是RequestObjectFactory.
- RequestObjectFactory的getObject其实是从RequestContextHolder的threadlocal中去取值的.
- 请求刚进入springmvc的dispatcherServlet的时候会把request相关对象设置到RequestContextHolder的threadlocal中去.
参考:在SpringMVC Controller中注入Request成员域 - abcwt112 - 博客园
4、参考
ThreadLocal详解
https://www.jianshu.com/p/3bb70ae81828
二、InheritableThreadLocal
1、说明
ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadLocal能够被子线程使用,实现方式就会相当困难(需要用户自己在代码中传递)。在此背景下,InheritableThreadLocal应运而生。
2、原理
创建新的线程时,会调用以下的构造方法。
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
我们沿着构造方法中的init方法,可以找到这样一段代码。就是在这里创建的 inheritableThreadLocals 。
if (inheritThreadLocals && parent.inheritableThreadLocals != null)
this.inheritableThreadLocals =
ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
继续查看 createInheritedMap 方法,里面新建了一个 ThreadLocalMap 对象,其构造方法如下。
分析代码我们可知,在创建子线程时,会将父线程的 inheritableThreadLocals 复制到子线程的 inheritableThreadLocals 对象。
private ThreadLocalMap(ThreadLocalMap parentMap) {
Entry[] parentTable = parentMap.table;
int len = parentTable.length;
setThreshold(len);
table = new Entry[len];
for (int j = 0; j < len; j++) {
Entry e = parentTable[j];
if (e != null) {
@SuppressWarnings("unchecked")
ThreadLocal<Object> key = (ThreadLocal<Object>) e.get();
if (key != null) {
Object value = key.childValue(e.value);
Entry c = new Entry(key, value);
int h = key.threadLocalHashCode & (len - 1);
while (table[h] != null)
h = nextIndex(h, len);
table[h] = c;
size++;
}
}
}
}
3、参考
InheritableThreadLocal详解
https://www.jianshu.com/p/94ba4a918ff5
三、ThreadLocal内存泄漏
https://blog.csdn.net/qq_25775675/article/details/105731434
边栏推荐
- Classification, function and usage of MySQL constraints
- 【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真
- pytorch_ Yolox pruning [with code]
- 硬件開發筆記(十): 硬件開發基本流程,制作一個USB轉RS232的模塊(九):創建CH340G/MAX232封裝庫sop-16並關聯原理圖元器件
- 第4章:再谈类的加载器
- 重磅新闻 | Softing FG-200获得中国3C防爆认证 为客户现场测试提供安全保障
- Anaconda installs third-party packages
- 变量与“零值”的比较
- pytorch_YOLOX剪枝【附代码】
- C# 三种方式实现Socket数据接收
猜你喜欢
ZABBIX proxy server and ZABBIX SNMP monitoring
MySQL数据库基本操作-DML
BarcodeX(ActiveX打印控件) v5.3.0.80 免费版使用
Aardio - 利用customPlus库+plus构造一个多按钮组件
C#實現水晶報錶綁定數據並實現打印4-條形碼
软考高级(信息系统项目管理师)高频考点:项目质量管理
Leetcode exercise - Sword finger offer 26 Substructure of tree
Attack and defense world ditf Misc
labelimg的安装与使用
PVL EDI 项目案例
随机推荐
中国1,4-环己烷二甲醇(CHDM)行业调研与投资决策报告(2022版)
墨西哥一架飞往美国的客机起飞后遭雷击 随后安全返航
网络基础入门理解
中国固态氧化物燃料电池技术进展与发展前景报告(2022版)
AI 企业多云存储架构实践 | 深势科技分享
二叉(搜索)树的最近公共祖先 ●●
Research and investment strategy report of China's VOCs catalyst industry (2022 Edition)
手写ABA遇到的坑
Senior soft test (Information System Project Manager) high frequency test site: project quality management
如何实现文字动画效果
Unity3d minigame unity webgl transform plug-in converts wechat games to use dlopen, you need to use embedded 's problem
2021 geometry deep learning master Michael Bronstein long article analysis
labelimg的安装与使用
Web APIs DOM time object
Solve project cross domain problems
PVL EDI project case
剪映+json解析将视频中的声音转换成文本
Chapter 3: detailed explanation of class loading process (class life cycle)
Seata aggregates at, TCC, Saga and XA transaction modes to create a one-stop distributed transaction solution
What are the interface tests? What are the general test points?