惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
SecWiki News
SecWiki News
P
Proofpoint News Feed
P
Palo Alto Networks Blog
L
LINUX DO - 热门话题
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Spread Privacy
Spread Privacy
A
Arctic Wolf
Recorded Future
Recorded Future
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园_首页
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
D
DataBreaches.Net
量子位
K
Kaspersky official blog
I
InfoQ
W
WeLiveSecurity
Engineering at Meta
Engineering at Meta
Scott Helme
Scott Helme
U
Unit 42
Cyberwarzone
Cyberwarzone
L
Lohrmann on Cybersecurity
Cisco Talos Blog
Cisco Talos Blog
T
Troy Hunt's Blog
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
Jina AI
Jina AI
Recent Announcements
Recent Announcements
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
C
Cybersecurity and Infrastructure Security Agency CISA
H
Heimdal Security Blog
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
Security Latest
Security Latest
B
Blog RSS Feed
Project Zero
Project Zero
C
Cisco Blogs
S
Securelist
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
T
Tor Project blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
F
Fortinet All Blogs

博客园 - 一个人的合唱

手写简易docker synchronized 泛型学习 反码与补码 解决128位秘钥长度限制的方法 CAP学习 读书笔记脑图列表 a=a++和a=++a centos7下安装python3 深入理解jvm虚拟机笔记(二) AtomicInteger的使用 volatile学习 echarts重新绘制的时候数据未更新 深入理解jvm虚拟机笔记(一) elasticsearch学习笔记 使用fiddler模拟post请求 二叉堆 二叉平衡树 二叉查找树
ThreadLocal的学习
一个人的合唱 · 2018-01-15 · via 博客园 - 一个人的合唱

作用域

方法之上,线程之内

作用

用户要跨方法访问变量,但若变量是全局变量的话虽然能访问了,但可能会产生并发问题,这时可以把要共享的值放入ThreadLocal中,线程内都能访问到,但所有线程访问却只能访问自己的,无法访问其他线程的,这就相当于线程私有的共享变量

原理

ThreadLocal相当于在内部做了线程识别,哪条线程放进该全局变量的数据,只有该线程才能访问。

实现

Thread类有个属性,持有ThreadLocal的静态内部类ThreadLocalMap的引用,放进来的值就存放在这里。ThreadLocal的常用操作get/set/remove中,都是先根据Thread.currentThread()获取当前线程这个对象,然后根据这个对象获取其属性中ThreadLocalMap的引用threadLocals,这个map以当前线程作为key,放进的值作为value来存取,因此当前线程只能获取当前线程放进去的值了,从而达到识别线程的效果。

  • 其相当于与线程绑定的变量,相当于线程私有的共享变量,所以最难把握的是"不知道哪里是源头"
  • 若是没有删除,则变量的生命周期与线程同长,若是线程归属于某个线程池,那么生命周期更是长久
  • 不应该用于异步程序,因为其与线程绑定,而回调时继续执行的可能是另一个线程

总结

这更多是一种技巧,而不是技术,其并非是什么语言新特性,不过是封装了这些手段和技巧,从而达到了对于不了解的人来说像java语言的一种特性一样,甚至java的特性不过也是对更底层的一种封装而已。