1.何为ThreadLocal?

ThreadLocal为解决多线程并发问题提供了一个新的解决方式。ThreadLocal并不是Thread,而是Thread的一个局部变量。
使用场景那也是相当的丰富:

1、在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。

2、线程间数据隔离

3、进行事务操作,用于存储线程事务信息。

4、数据库连接,Session会话管理。

2.ThreadLocal的实现原理

ThreadLocal起作用的根源是Thread类:

public class Thread implements Runnable {......(其他源码)/* * 当前线程的ThreadLocalMap,主要存储该线程自身的ThreadLocal* 本文主要讨论的就是这个ThreadLocalMap*/ThreadLocal.ThreadLocalMap threadLocals = null;/** InheritableThreadLocal,自父线程集成而来的ThreadLocalMap,* 主要用于父子线程间ThreadLocal变量的传递* 此处我们不过多解释inheritableThreadLocals变量*/ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;......(其他源码)}
 /*** Sets the current thread's copy of this thread-local variable* to the specified value.  Most subclasses will have no need to* override this method, relying solely on the {@link #initialValue}* method to set the values of thread-locals.** @param value the value to be stored in the current thread's copy of*        this thread-local.*/public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}ThreadLocalMap getMap(Thread t) {return t.threadLocals;}void createMap(Thread t, T firstValue) {t.threadLocals = new ThreadLocalMap(this, firstValue);}public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}return setInitialValue();}private T setInitialValue() {T value = initialValue();Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);return value;}

ThreadLocalMap是ThreadLocal类的一个静态内部类,它实现了键值对的设置和获取(对比Map对象来理解),每个线程中都有一个独立的ThreadLocalMap副本,它所存储的值,只能被当前线程读取和修改。ThreadLocal类通过操作每一个线程特有的ThreadLocalMap副本,从而实现了变量访问在不同线程中的隔离。因为每个线程的变量都是自己特有的,完全不会有并发错误。还有一点就是,ThreadLocalMap存储的键值对中的键是this对象指向的ThreadLocal对象,而值就是你所设置的对象了。

Threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露.

总结

ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,单大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。
ThreadLocal不能使用基本数据类型,只能使用Object类型。

参考文献

https://www.jianshu.com/p/3bb70ae81828

谈谈你对ThreadLocal的理解相关推荐

  1. python中ThreadLocal的理解与使用

    一.对 ThreadLocal 的理解 ThreadLocal,有的人叫它线程本地变量,也有的人叫它线程本地存储,其实意思一样. ThreadLocal 在每一个变量中都会创建一个副本,每个线程都可以 ...

  2. 谈谈对APC的一点理解

    谈谈对APC的一点理解 异步过程调用(APCs) 是NT异步处理体系结构中的一个基础部分,理解了它,对于了解NT怎样操作和执行几个核心的系统操作很有帮助. 1) APCs允许用户程序和系统元件在一个进 ...

  3. ThreadLocal的理解

    ThreadLocal的理解     [文章出处]http://blog.csdn.net/lufeng20/article/details/24314381 (五星推荐)     [参考博客]htt ...

  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 04 谈谈你对分布式的理解,为什么引入分布式?

    04谈谈你对分布式的理解,为什么引入分布式? 引言 刚刚毕业第一份工作,没接触过分布式微服务相关的知识,后来换工作才了解到这些,面试官看了我简历里写了分布式相关,就开始揪住这个问题问,虽然一知半解地说 ...

  5. JVM面试1 :谈谈你对Java的理解

    谈谈你对Java的理解 如何查看字节码? 使用 javap

  6. MVVM是什么?谈谈你对MVVM的理解?

    MVVM是什么?谈谈你对MVVM的理解? 我的理解MVVM它就是一种前端开发的架构模式,作用就是为了让前端业务逻辑和HTML代码更加分离.它的核心思想就是把每个页面分成了M(Model数据模型).V( ...

  7. 一.对ThreadLocal的理解

    一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多.可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个 ...

  8. 分布式 - 谈谈你对分布式的理解,为什么引入分布式?

    不啰嗦,我们直接开始! 划重点: 真正了解分布式系统的概念,日后工作中具有分布式系统设计思想. 能否在设计中对系统稳定性方面考虑周全. 能构建高 QPS 健壮的系统架构. 1.面试官:那谈谈你对分布式 ...

  9. 结合阿里云 FC 谈谈我对 FaaS 的理解

    本文首发于政采云前端团队博客:结合阿里云 FC 谈谈我对 FaaS 的理解 https://www.zoo.team/article/my-understanding-of-faas 进入主题之前,先 ...

  10. 谈谈对数据治理的理解

    谈谈对数据治理的理解 一.什么是数据治理?为什么要做数据治理? 1.数据标准 2.数据模型 3.元数据 4.主数据 5.数据质量管理 二.怎样做数据治理 一.什么是数据治理?为什么要做数据治理? 数据 ...

最新文章

  1. 腾讯第100个开源项目:微信开源推理加速工具TurboTransformers
  2. 2018年Java生态行业报告
  3. java B2B2C Springboot多租户电子商城系统-spring-cloud-eureka-consumer...
  4. 你的创业余额还够么—网易阿里大咖带你领略大数据
  5. VTK:几何对象之LongLine
  6. LDAP用户验证(Spring-LDAP)
  7. tiny4412 linux+qtopia nfs网络文件系统的挂载
  8. Yii2 的快速配置 api 服务 yii2-fast-api
  9. excel公式编辑器_Excel中自动更新超链接的文件目录,超简单
  10. 【LeetCode笔记】2. 两数相加(JAVA、链表)
  11. linux自动重新启动,linux 系统自动重新启动,请帮忙看看
  12. Lunix服务器上项目迁移命令
  13. Notebook左侧开启导航
  14. 动态IP和静态IP地址
  15. 动态逆序对:CDQ分治
  16. PyQt设置右下角弹窗
  17. 平凡的生活,不平凡的2020
  18. word分栏及序号对齐
  19. 一、OpenAI ChatGPT 注册使用
  20. 计算机基础题word,计算机应用基础试题(带答案)Word版

热门文章

  1. TypeScript 之 infer
  2. 保龄球记分程序c语言,老鸟救命~关于保龄球记分规则的程序
  3. 03一般过去时和主谓双宾
  4. 10php1c,很急的一個問題,請幫幫忙
  5. dedecms源码分析(第一部分)
  6. React中使用worker线程
  7. python画两条曲线_python 实现将多条曲线画在一幅图上的方法
  8. 越过山丘才发现无人等候 倒计时84
  9. oracle11gora1435,oracle导入的问题
  10. 2013-2015南京大学历史学系若干考试题目汇编