ThreadLocal了解
ThreadLocal在项目中应该都会遇到,简单的理解就是线程私有的?那么如何实现的呢?
一、实现
Threadlocal是绑定在线程上的,可以看到Thread类中有一个属性是ThreadLocal中的一个内部类ThreadLocalMap.
什么时候会对这个属性赋值呢?当new一个ThreadLocal的时候后,调用set方法或者setInitialValue方法的时候,会调用createMap方法,createMap方法则是为当前线程的threadlocals属性赋值,代码如下:
map中有一个entry,key为当前threadlocal,value则为设置的值,也就是说一个thread的map属性可以有多个threadlocal,并且是通过健值来维护的。
二、Threadlocal的生命周期:
1、随着threadlocal的new产生,随着线程的总结而结束
2、随着threadlocal的new产生,随着调用remove方法而结束
三、threadlocal注意点:
threadlocal可能有一种情况有机会会发生内存泄露问题。看下threadlocalmap的源码:
可以看到key的threadlocal是一个弱引用,对于jvm,引用有四种类型:强、软、弱、虚,弱引用在jvm发生gc的时候,无论什么情况都会被直接回收。这里就有个问题,如果gc后,key被回收掉变为空,但是value依然存在,也永远用不到,造成了资源浪费。当然在类中的get和set的时候(实现在threadlocalmap中的getentry和set中),如果有空key则会删除对应entry,所以如果调用了remove、get、set或者线程直接结束,这种内存泄露都是不会出现的。
上面的情况一般不会出现内存泄露,但是如果在使用线程池的时候,如果线程使用完毕不回收,放回池中,正好有没有调用remove、get、set方法,那么value永远不会被回收,长期后,造成内存泄露的可能性很大。
转载于:https://www.cnblogs.com/guoliangxie/p/7455946.html
ThreadLocal了解相关推荐
- FastThreadLocal吞吐量居然是ThreadLocal的3倍
目前关于FastThreadLocal的很多文章都有点老有点过时了(本文将澄清几个误区),很多文章关于FastThreadLocal介绍的也不全,希望本篇文章可以带你彻底理解FastThreadLoc ...
- 正确理解ThreadLocal
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt107 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的, ...
- 什么是ThreadLocal
顾名思义它是local variable(线程局部变量).它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.从线 ...
- 为什么jdk源码推荐ThreadLocal使用static
ThreadLocal是线程私有变量,本身是解决多线程环境线程安全,可以说单线程实际上没必要使用. 既然多线程环境本身不使用static,那么又怎么会线程不安全.所以这个问题本身并不是问题,只是有人没 ...
- Spring源码分析【6】-ThreadLocal的使用和源码分析
Spring代码使用到了ThreadLocal java.lang.ThreadLocal.set getMap java.lang.Thread.threadLocals定义 回到set 如果map ...
- threadlocal使用场景_深入剖析ThreadLocal
点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 朋友们在遇到线程安全问题的时候,大多数情况下可能会使用synchronized关键字,每次只允许一个线程进入锁定的方法或代码块,这样就可以保 ...
- ThreadLocal源码分析
ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见.ThreadLocal正式提供了这样的机制,详细使用方式请参 ...
- ThreadLocal的使用场景
最近项目中遇到如下的场景:在执行数据迁移时,需要按照用户粒度加锁,因此考虑使用排他锁,迁移工具和业务服务属于两个服务,因此需要使用分布式锁. 我们使用缓存(Tair或者Redis)实现分布式锁,具体代 ...
- ThreadLocal的使用方法
ThreadLocal的含义是Thread Local Variable,它可以声明一个字段,使得不同的线程访问这个字段时,获取的都是不同的副本,互不影响. ThreadLocal的作用和在每个Thr ...
- PageHelper 使用 ThreadLocal 的线程复用问题
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://blog.csdn.net/qq_38245668/article/details/105984171/ 前言 ...
最新文章
- 前20个关于FLEX技术、源码、实例、技巧的网站.
- Swift 中的指针使用
- 初中人教版电子课本app_电子课本|2020秋 部编人教版初中历史七年级上册教材电子课本(高清更新可打印)...
- JAVA前三章预习总结
- [Ext JS 4] 实战之Load Mask - 在Grid Reconfigure的使用状况
- 服务器java 客户端c_Java客户端和C ++服务器通过TCP套接字发送和接收
- 基于winpcap的网络数据包的捕获与分析
- 读写文本文件时汉字乱码
- (13)机器学习_LogisticRegression
- 有关top命令中的%st,sar命令中的%steal .
- f分布表完整图a=0.01_桥梁横向分布系数计算方法及案例详解
- 数据库查询-模糊查询
- 【下载】跨越鸿沟:颠覆性产品营销圣经-杰弗里·摩尔电子书下载(pdf,epub,mobi,txt)
- win10 双屏 窗口显示快捷键
- ips 测试软件,IPS测试方法.doc
- Microsoft Visual SourceSafe 2005 服务端安装配置过程以及出现的问题,以及解决方法!...
- SAP MM 增值税改革导致采购业务的变化
- IDEA修改静态资源(html)不重启,即时生效
- 广东医科大学计算机网络,广东海洋大学计算机网络历年考题(直接阅读版6套可编辑)课件.doc...
- 周四见-王晓伟 |MySQL与数据仓库的数据交互
热门文章
- cesium +vue项目怎么运行
- c++ main函数调用 类中的枚举_为什么 Java 的 main 方法必须是 public static void?
- 企业微信小程序可用存储空间不足_微信小程序为什么能帮助企业商家引流?
- 解决:git push error: failed to push some refs to
- 磁盘格式 mac android,MacDroid for mac(安卓手机数据传输助手)
- linux系统下idea打包apk教程,intellij idea14打包apk文件和查看sha1值
- astar插件下载 就行_送给你们一个ps插件,5秒抠图神器,这个肯定是你找了很久的...
- python写登录界面跳转至数据库操作_pycharm+jdango+python实现创建web工程并实现简单登陆...
- plc仿真实训软件_欧倍尔新品:现代电气控制和自动生产线装调两款虚拟仿真实训软件...
- 3Y叔的clusterProfiler-book阅读Chapter 3 Universal enrichment analysis