架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12603|回复: 1

[资料] Java ThreadLocal 原理和多线程重用导致数据混乱

[复制链接]
发表于 2021-11-1 11:45:36 | 显示全部楼层 |阅读模式
在编程中,我们定义方法参数,来传递变量内容,如果执行的方法层级很深,那么每个方法都需要定义传递的参数,这时候,可以通过 ThreadLocal 来传递一些变量,只要所有方法在同一个线程下执行,就可以设置和读取 ThreadLocal 的值。

ThreadLocal 类是用来提供线程内部的局部变量。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。

ThreadLocal 在执行set方法时会先获取当前线程(Thread t = Thread.currentThread()),使用当前线程去拿到一个ThreadLocalMap,如果这个map不为空,说明当前线程之前有绑定过的map,就更新这个这个map的value,如果没有就以自身为key把值放到map中,从而实现变量与线程的绑定。

QQ截图20211101113442.jpg

测试代码,设置线程池最大维护 5 个线程,当在多线程的情况下,我们在调用 ThreadLocal get 方法的时候,会获取到 ThreadLocal 数据(其它线程设置的数据),我们并没有在当前线程调用 ThreadLocal set 方法去设置数据,如下图:

QQ截图20211101112158.jpg

错误原因:一旦线程重用,那么很可能首次从 ThreadLocal 获取的值是之前其他线程遗留的值

因为,我们在当前线程使用 ThreadLocal 完成后,一定要调用 remove 及时的清除。如下图:

QQ截图20211101112235.jpg

代码:

(完)





上一篇:Docker 查看容器 restart 设置和批量停止容器
下一篇:Jenkins(五)项目分组展示
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-11-2 21:30:12 | 显示全部楼层
又来学习学习。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-24 12:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表