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了解相关推荐

  1. FastThreadLocal吞吐量居然是ThreadLocal的3倍

    目前关于FastThreadLocal的很多文章都有点老有点过时了(本文将澄清几个误区),很多文章关于FastThreadLocal介绍的也不全,希望本篇文章可以带你彻底理解FastThreadLoc ...

  2. 正确理解ThreadLocal

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt107 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的, ...

  3. 什么是ThreadLocal

    顾名思义它是local variable(线程局部变量).它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.从线 ...

  4. 为什么jdk源码推荐ThreadLocal使用static

    ThreadLocal是线程私有变量,本身是解决多线程环境线程安全,可以说单线程实际上没必要使用. 既然多线程环境本身不使用static,那么又怎么会线程不安全.所以这个问题本身并不是问题,只是有人没 ...

  5. Spring源码分析【6】-ThreadLocal的使用和源码分析

    Spring代码使用到了ThreadLocal java.lang.ThreadLocal.set getMap java.lang.Thread.threadLocals定义 回到set 如果map ...

  6. threadlocal使用场景_深入剖析ThreadLocal

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 朋友们在遇到线程安全问题的时候,大多数情况下可能会使用synchronized关键字,每次只允许一个线程进入锁定的方法或代码块,这样就可以保 ...

  7. ThreadLocal源码分析

    ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见.ThreadLocal正式提供了这样的机制,详细使用方式请参 ...

  8. ThreadLocal的使用场景

    最近项目中遇到如下的场景:在执行数据迁移时,需要按照用户粒度加锁,因此考虑使用排他锁,迁移工具和业务服务属于两个服务,因此需要使用分布式锁. 我们使用缓存(Tair或者Redis)实现分布式锁,具体代 ...

  9. ThreadLocal的使用方法

    ThreadLocal的含义是Thread Local Variable,它可以声明一个字段,使得不同的线程访问这个字段时,获取的都是不同的副本,互不影响. ThreadLocal的作用和在每个Thr ...

  10. PageHelper 使用 ThreadLocal 的线程复用问题

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://blog.csdn.net/qq_38245668/article/details/105984171/ 前言 ...

最新文章

  1. 前20个关于FLEX技术、源码、实例、技巧的网站.
  2. Swift 中的指针使用
  3. 初中人教版电子课本app_电子课本|2020秋 部编人教版初中历史七年级上册教材电子课本(高清更新可打印)...
  4. JAVA前三章预习总结
  5. [Ext JS 4] 实战之Load Mask - 在Grid Reconfigure的使用状况
  6. 服务器java 客户端c_Java客户端和C ++服务器通过TCP套接字发送和接收
  7. 基于winpcap的网络数据包的捕获与分析
  8. 读写文本文件时汉字乱码
  9. (13)机器学习_LogisticRegression
  10. 有关top命令中的%st,sar命令中的%steal .
  11. f分布表完整图a=0.01_桥梁横向分布系数计算方法及案例详解
  12. 数据库查询-模糊查询
  13. 【下载】跨越鸿沟:颠覆性产品营销圣经-杰弗里·摩尔电子书下载(pdf,epub,mobi,txt)
  14. win10 双屏 窗口显示快捷键
  15. ips 测试软件,IPS测试方法.doc
  16. Microsoft Visual SourceSafe 2005 服务端安装配置过程以及出现的问题,以及解决方法!...
  17. SAP MM 增值税改革导致采购业务的变化
  18. IDEA修改静态资源(html)不重启,即时生效
  19. 广东医科大学计算机网络,广东海洋大学计算机网络历年考题(直接阅读版6套可编辑)课件.doc...
  20. 周四见-王晓伟 |MySQL与数据仓库的数据交互

热门文章

  1. cesium +vue项目怎么运行
  2. c++ main函数调用 类中的枚举_为什么 Java 的 main 方法必须是 public static void?
  3. 企业微信小程序可用存储空间不足_微信小程序为什么能帮助企业商家引流?
  4. 解决:git push error: failed to push some refs to
  5. 磁盘格式 mac android,MacDroid for mac(安卓手机数据传输助手)
  6. linux系统下idea打包apk教程,intellij idea14打包apk文件和查看sha1值
  7. astar插件下载 就行_送给你们一个ps插件,5秒抠图神器,这个肯定是你找了很久的...
  8. python写登录界面跳转至数据库操作_pycharm+jdango+python实现创建web工程并实现简单登陆...
  9. plc仿真实训软件_欧倍尔新品:现代电气控制和自动生产线装调两款虚拟仿真实训软件...
  10. 3Y叔的clusterProfiler-book阅读Chapter 3 Universal enrichment analysis