ThreadLocal原理大解析
今天呢,和大家聊一下ThreadLocal
。
1. 是什么?
JDK1.2
提供的的一个线程绑定变量的类。
他的思想就是:给每一个使用到这个资源的线程都克隆一份,实现了不同线程使用不同的资源,且该资源之间相互独立
2. 为什么用?
思考一个场景:数据库连接的时候,我们会创建一个Connection
连接,让不同的线程使用。这个时候就会出现多个线程争抢同一个资源的情况。
这种多个线程争抢同一个资源的情况,很常见,我们常用的解决办法也就两种:空间换时间,时间换空间
没有办法,鱼与熊掌不可兼得也。就如我们的CAP
理论,也是牺牲其中一项,保证其他两项。
而针对上面的场景我们的解决办法如下:
- 空间换时间:为每一个线程创建一个连接。
- 直接在线程工作中,创建一个连接。(重复代码太多)
- 使用
ThreadLocal
,为每一个线程绑定一个连接。
- 时间换空间:对当前资源加锁,每一次仅仅存在一个线程可以使用这个连接。
通过ThreadLocal
为每一个线程绑定一个指定类型的变量,相当于线程私有化
3. 怎么用?
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.get();
threadLocal.set(1);
threadLocal.remove();
没错,这四行代码已经把ThreadLocal
的使用方法表现得明明白白。
get
从ThreadLocal
拿出一个当前线程所拥有得对象set
给当前线程绑定一个对象remove
将当前线程绑定的当前对象移除
记住在使用的以后,一定要remove,一定要remove,一定要remove
为什么要remove
。相信不少小伙伴听到过ThreadLocal
会导致内存泄漏问题。
没错,所以为了解决这种情况,所以你懂吧,用完就移除,别浪费空间(渣男欣慰)
看到这,脑袋上有好多问号出现了(小朋友你是否有很多问号?)
为啥会引发内存泄漏?
为啥不remove就内存泄漏了
它是怎么讲对象和线程绑定的
为啥get的时候拿到的就是当前线程的而不是其他线程的
它怎么实现的???
来吧,开淦,源码来
4. 源码解读
先来说一个思路:如果我们自己写一个ThreadLocal
会咋写?
线程绑定一个对象。这难道不是我们熟知的 目录 1. 从一次项目经历说起 2. ThreadLocal源码解析 2.1 set方法源码解析 2.2 get方法源码解析 2.3 ThreadLocal源码总结 3. ThreadLocalMap ... java基础解析系列(七)---ThreadLocal原理分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ... GBDT算法原理深入解析 标签: 机器学习 集成学习 GBM GBDT XGBoost 梯度提升(Gradient boosting)是一种用于回归.分类和排序任务的机器学习技术,属于Boosting ... Java8 Stream原理深度解析 Author:Dorae Date:2017年11月2日19:10:39 转载请注明出处 上一篇文章中简要介绍了Java8的函数式编程,而在Java8中另外一个比 ... 日志"路由及路由器工作原理深入解析1"http://user.qzone.qq.com/2756567163/blog/1438322342介绍了"为什么要使用路 ... Netty原理架构解析 转载自:http://www.sohu.com/a/272879207_463994本文转载关于Netty的原理架构解析,方便之后巩固复习 Netty是一个异步事件驱动的网络应 ... mysql索引原理深度解析 一.总结 一句话总结: mysql索引是b+树,因为b+树在范围查找.节点查找等方面优化 hash索引,完全平衡二叉树,b树等 1.数据库中最常见的慢查询优化方式是什么? ... 简析ThreadLocal原理及应用 原创: 东晨雨 JAVA万维猿圈 4月17日 ThreadLocal的源码加上注释不超过八百行,源码结构清晰,代码也比较简洁.ThreadLocal可以说是Jav ... 描述 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储.ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量. 通常使用静态的变 ... 一.背景 最近产品叫我做一些集团系列的统计图,包括集团组织.协作.销售.采购等方面的.作为一名后端程序员,于是趁此机会来研究研究这个库. 如果你仅仅停留在用的层面,那还是蛮简单的. 二.介绍 ECha ... 1.一般的python爬虫很简单,直接请求对应网址,解析返回的数据即可,但是有很多网站的数据的js动态渲染的,你直接请求是得不到对应的数据的 这时就需要其它手段来处理了. 2.以一个例子来说明,整个过 ... 参考:https://blog.csdn.net/iamgamer/article/details/79354617 其中有两个位运算,一个是>>,一个是&. 0xff的作用一: ... 下载 minimistminimist 解析参数选项 这个模块是乐观主义者参数解析器的核心,没有所有的 奇特的装饰. 例子 var argv = require('minimist')(process ... 介绍 vim是一个文本编辑程序 没有菜单,只有命令,且命令繁多 命令行模式下相关命令 移动光标 h: ← 左移 l: → 右移 j: ↓ 下移 k: ↑ 上移 gg: 光标移动文件 ... 论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf论文:YOLOv3: An Incremental Improvement YOLO系列的 ... 当程序员在使用浮点数进行计算逻辑处理时,不注意,就可能出现问题, 记住,永远不要直接比较俩个浮点的大小 这个属于数字运算中的精度缺失的问题 在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的 ... 摘要. GIS的空间数据基本单位表示通常是根据 点,线和面.但是,另一种类型的空间数据正在变得越来越频繁 捕获的是视频,但在GIS中却被很大程度上忽略了.数字录像时 是现代社会中常见的一种媒介,包含多 ... 实验四 B2B模拟实验 [实验目的] ⑴.掌握B2B中供应商的供求信息发布.阿里商铺开设和订单交易等过程. ⑵.掌握B2B中采购商的采购信息的发布.交易洽谈.网上支付和收货等过程. [实验条件] ⑴ ... 这个脚本示例读取文本格式的闪电数据,读出每条闪电记录的经纬度和强度,在地图上绘制出每个闪电的位置,并用符号和颜色区分强度正负.数据格式如下:0 2009-06-06 00:01:16.6195722 ...map
映射?有了Map
我们就可以以线程为Key
,对象为value
添加到一个集合中,然后各种get,set,remove
操作,想怎么玩就怎么玩,搞定。
ThreadLocal原理大解析的更多相关文章
随机推荐