一张图解决ThreadLocal
一张图解决ThreadLocal
一、前言
年底梳理知识体系时,研究了一下ThreadLocal的源码,整理了一张核心图。
想着,都走到这一步了,那就写一篇深度解读的文章吧。看过我之前文章的小伙伴都知道,我写博客,就喜欢写点别人没写的。要么就写个结构比别人好的。什么都不行,那就别写了。自己留着看就好了。
然后发现了ThreadLocal源码解读与ThreadLocal可能引起的内存泄露这样的优秀文章(两篇文章合起来,就更完整了),它把我要说的,差不多都说了。
所以,我就决定从精简(一张图)与认知过程两方面,写一篇辅助学习ThreadLocal的文章。
二、核心图
不啰嗦,核心图直接贴上。
根据核心图,已经对ThreadLocal了然于心的小伙伴,可以拿着图片,溜了溜了。
还想听我谈谈,我对ThreadLocal认知过程的小伙伴,可以留下来看看。
三、认知过程
话说,那是一个夜黑风高的夜晚,我躺在。。。
咳咳咳。抱歉,串场了。
最早接触ThreadLocal的时候,是在看面试教程的时候。我听到讲师balabala讲了一通,最后我脑海给ThreadLocal的第一印象就是,一个确保线程安全的线程变量(同一个变量,但每个线程都独立)。这个印象伴随了我大半年,反正我在那大半年也没用过。。。
后来,在一次看技术文章的时候,又看到了一篇ThreadLocal的介绍。通篇看下来,这篇文章说的内容,除了我学过的,就是总结了一句ThreadLocal可以简单看成一个Map<Thread, Object>。当时的我,还欣喜若狂,我终于懂得ThreadLocal的原理了。
再后来,我在微信的技术公众号中,看到ThreadLocal的内存泄漏问题。那篇文章把这个问题说得非常严重,搞得好像这个问题导致了二战爆发那么严重。如果不懂这个问题,就不配参加面试,不配呼吸这个世界的美好空气。。。幸好当时没人知道,我不懂这个东西。然后我就趁着午休的时间,速度翻了翻这篇文章。看完之后,脑海中的印象就是,ThreadLocal中的map的key是WeakReference,可能被清除,导致对应的value内存泄漏。
在接下来的小半年里,我也曾奇怪,如果ThreadLocal是一个Map<Thread, Object>,那为什么一个线程可以有多个ThreadLocal变量呢?为什么设置ThreadLocal变量时,还需要设置范型类型呢?
直到在学习另一个课程时,讲师提到栈封闭-ThreadLocal,才知道之前的认识是错误的。其实每个线程都有一个Map<ThreadLocal, Object>,这也解释了我之前的两个问题。但是当时由于工作与课程比较紧,还是没有查看源码。终究还是与ThreadLocal隔层纱。
最近临近年底,整理自己的知识体系。这次打算好好整理整理,所以就仔细阅读了ThreadLocal的源码。也知道之所以每个线程都有一个Map<ThreadLocal, Object>,是因为Thread有一个ThreadLocalMap(ThreadLocal内部类)变量。进而总结出了上面的核心图。
四、总结
之所以提到ThreadLocal的认识过程,其实是想表达:
- 认识是螺旋前进的
- 如无必要,不要过于追求认识的深度
- 想法要周全,执行要坚决
第一条的意思是,我们对某个事物的认识,往往伴随着正确&错误之间的游走。但是认识是在不断加深,变得更加全面的。
至于第二条,如果一开始我就强求看源码,那一定是事倍功半的。那时候的我对范型,弱应用等都了解太浅,缺乏足够的基础,让我一窥ThreadLocal的全貌。具体的反面教材,就是当时刚入Java坑的我,强行撸Spring源码。。。樯橹灰飞烟灭啊。。。
第三条,在自己有想法的时候,需要周全想法。如果有了决策结果,就应该去坚决地贯彻它。
不得不说,温故而知新啊。
愿与诸君共进步。
参考
一张图解决ThreadLocal的更多相关文章
- 一张图解决Struts2添加源码
主要是选择的路径:F:/struts2/struts-2.3.31/src/core/src/main/java
- 一张图彻底理解Spring如何解决循环依赖!!
写在前面 最近,在看Spring源码,看到Spring解决循环依赖问题的源码时,不得不说,源码写的太烂了.像Spring这种顶级的项目源码,竟然存在着这种xxx的代码.看了几次都有点头大,相信很多小伙 ...
- Nodejs学习笔记(三)——一张图看懂Nodejs建站
前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...
- 一张图告诉你为什么 Gmail 是最好的邮箱,以及大量私货
今天早上,我的同事详细介绍了 Gmail 相比其他邮箱的优势,比如强大的垃圾邮件过滤.简单的使用界面.强大的功能设置等等.但是对我来说,这些并不是我使用 Gmail 的最重要原因. 我第一个正式的邮箱 ...
- 一张图看懂DNS域名解析全过程
DNS域名解析是互联网上非常重要的一项服务,上网冲浪(还有人在用这个词吗?)伴随着大量DNS服务来支撑,而对于网站运营来说,DNS域名解析的稳定可靠,意味着更多用户的喜欢,更好的SEO效果和更大的访问 ...
- HTML5利用canvas,把多张图合并成一张图片
需求分析,根据当前网页中的几张图片,在手机上长按,保存图片到相册或者发送给好友. drawCanvas(){ var self = this; var imgsrcArray = [ require( ...
- SpringBoot图片上传(四) 一个input上传N张图,支持各种类型
简单介绍:需求上让实现,图片上传,并且可以一次上传9张图,图片格式还有要求,网上找了一个测试了下,好用,不过也得改,仅仅是实现了功能,其他不尽合理的地方,还需自己打磨. 代码: //html<d ...
- 一张图了解Spring Cloud微服务架构
Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...
- 产品经理-需求分析-用户故事-敏捷开发 详解 一张图帮你了解Scrum敏捷流程
产品经理-需求分析-用户故事-敏捷开发 详解 用户故事是从用户的角度来描述用户渴望得到的功能.一个好的用户故事包括三个要素:1. 角色:谁要使用这个功能.2. 活动:需要完成什么样的功能.3. 商业价 ...
随机推荐
- 【Linux】ntp的一些坑。你肯定遇到过
ntpdate提示 19 Jan 10:33:11 ntpdate[29616]: no server suitable for synchronization found 这种问题从下面几个点开始验 ...
- linux查看文件夹和磁盘内存及服务器对应的ip
多进程统计cpu 数目 n_cpu = multiprocessing.cpu_count() print(n_cpu) 查看文件夹占用磁盘空间 du -h --max-depth=1 /path 查 ...
- Test typora
目录 0. test 0.5 easy test 1. problem 1 2. problem 2 3. problem 3 import numpy as np import matplotlib ...
- 08--Docker安装Mysql
1.在hub.docker.com中查找5.7版本 2.拉取mysql docker pull mysql:5.7 3.启动mysql镜像 docker run -p 3306:3306 --name ...
- Linux内核分析_课程学习总结报告
请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的.自洽的,并举例某一两个具体例子(比如读写文件.分配内存.使用I/O ...
- canvas星空背景特效+CSS旋转相册学习
今天在看帖子的时候,看到了个有趣的css旋转相册,刚好之前做了一个星空背景dome,这里给大家分享下代码: 旋转相册参考:https://blog.csdn.net/gitchatxiaomi/art ...
- 并发编程常用工具类(一) countDownLatch和cyclicBarrier的使用对比
1.CountDownLatch countDownLatch的作用是让一组线程等待其他线程完成工作以后在执行,相当于加强版的join(不懂可以百度一下join的用法),一般在初始 ...
- node集群(cluster)
使用例子 为了让node应用能够在多核服务器中提高性能,node提供cluster API,用于创建多个工作进程,然后由这些工作进程并行处理请求. // master.js const cluster ...
- Power of Two Choices 负载均衡
NGINX and the "Power of Two Choices" Load-Balancing Algorithm - NGINX https://www.nginx.co ...
- Why failover-based implementations are not enough Redis分布式锁实现 SET resource_name my_random_value NX PX 30000
核心 SET resource_name my_random_value NX PX 30000 Distributed locks with Redis – Redis https://redis. ...