ThreadLocal的一些想法

1、设计目的

个人理解,ThreadLocal是解决变量域的问题。我们有静态变量、实例变量、方法局部变量,各自有各自的作用域。现在希望有一种变量的作用域为线程的生命周期,可以理解为线程内部变量,并且线程与线程之间的变量是隔离的。

如何设计咧?

因为线程有Thread这个对象存在,最简单的方式是Thread对象内部持有一个实例变量,比如说HashMap。存取数据就是操作map。为什么不用List咧?我们肯定是希望能在Thread内部放多个变量,用list还需遍历操作,用map,直接用key就可以获取了。

现在,我们可以考虑Thread对象的内部用map存在数据,value可以确定,就是我们希望存放的数据。key用什么来表示咧?jdk提供的方案就是ThreadLocal。

以上想法,纯属个人理解。

2、ThreadLocal原理

按照上述思路,我们现在thread内部用map来存放变量,jdk提供的就是ThreadLocalMap。

2.1、ThreadLocalMap

该map就是上述提及的存放数据的map,它就是Thread的实例变量,变量名为:threadLocals,见下图。

public class Thread implements Runnable {ThreadLocal.ThreadLocalMap threadLocals = null;
}

此处我们先不管ThreadLocalMap有什么特殊地方,反正本质就是map。现在,该map是null,我们可以通过反调查询该map是在哪初始化的。

2.2、ThreadLocalMap初始化

通过idea反调工具,可以看见初始化在ThreadLocal#createMap中创建的

2.2.1、createMap

我们进入createMap方法看看,可以看到,方法很简单。就是创建一个ThreadLocalMap,key是ThreadLocal对象本身。然后将该map赋值到传入的Thread对象中。

public class ThreadLocal<T> {//创建map,放入第一个值void createMap(Thread t, T firstValue) {//this,表示ThreadLocal对象本身,也就是ThreadLocal对象为key,并非网上的thread为key。t.threadLocals = new ThreadLocalMap(this, firstValue);}
}

我们可以继续通过反调确认哪些方法在调用createMap的方法,结果如下:

可以看到,主要是set()方法。那接下来,我们就看看set方法。

2.3、set方法

该方法就是我们用来保存变量的方法,也比较简单,有懒加载的思想:

  • 获取当前线程
  • 获取线程对象中的ThreadLocalMap,不为空,就保存value
  • map为空就创建map并保存value
public class ThreadLocal<T> {public void set(T value) {Thread t = Thread.currentThread();//获取线程的ThreadLocalMapThreadLocalMap map = getMap(t);if (map != null)//赋值map.set(this, value);else//创建并保存valuecreateMap(t, value);}
}

createMap之前已经介绍了,我们来看看getMap的方法

2.3.1 、getMap

getMap也是非常简单,就是返回当前线程对象内部的ThreadLocalMap:

public class ThreadLocal<T> {ThreadLocalMap getMap(Thread t) {return t.threadLocals;}
}

2.4、get方法

通过前面的介绍,大概也能猜到该方法,就是获取当前线程的ThreadLocalMap,然后获取value。key是当前的ThreadLocal对象本身。

public class ThreadLocal<T> {public T get() {//当前线程Thread t = Thread.currentThread();//获取mapThreadLocalMap map = getMap(t);if (map != null) {//获取valueThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}//当前map为null时,初始化null值给valuereturn setInitialValue();}
}

2.5、使用场景和注意事项

此处就不贴了,网上的资料很多。

3、总结

在Thread的对象内部有一个实例变量ThreadLocalMap,它可以用来存放数据。每个线程都有对应Thread对象,即每个线程内部都有自己的变量。

ThreadLocal的一些想法相关推荐

  1. 正确理解ThreadLocal

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

  2. JDK7 源码学习系列——ThreadLocal

    为什么80%的码农都做不了架构师?>>>    学习JDK中的类,首先看下JDK API对此类的描述,描述如下: 该类提供了线程局部 (thread-local) 变量.这些变量不同 ...

  3. 「图解」ThreadLocal 在并发问题中的应用

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 前言 到底什么是线程的不安全?为什么会存在线程的不安全?线程的不安全其实就是多个线程并发的去 ...

  4. 死磕Java并发:深入分析ThreadLocal

    本文转载自公众号: Java技术驿站 ThreadLoacal是什么? ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线 ...

  5. ThreadLocal可以解决并发问题吗

    前言 到底什么是线程的不安全?为什么会存在线程的不安全?线程的不安全其实就是多个线程并发的去操作同一共享变量没用做同步所产生意料之外的结果.那是如何体现出来的呢?我们看下面的一个非常经典的例子:两个操 ...

  6. ThreadLocal父子线程传递实现方案

    前言 介绍InheritableThreadLocal之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:ThreadLocal源码分析解密.在讲解之前我 ...

  7. 深入理解ThreadLocal

    学习JDK中的类,首先看下JDK API对此类的描述,描述如下: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set ...

  8. 我对ThreadLocal的理解

    声明:小弟菜狗一个.对ThreadLocal的描写叙述和理解难免有所偏差 近期由于须要深入的了解android的handler消息机制而去查看了Looper的源代码.众所周知在主线程中是不须要在程序猿 ...

  9. ThreadLocal中的3个大坑,内存泄露都是小儿科!

    我在参加Code Review的时候不止一次听到有同学说:我写的这个上下文工具没问题,在线上跑了好久了.其实这种想法是有问题的,ThreadLocal写错难,但是用错就很容易,本文将会详细总结Thre ...

最新文章

  1. MS Sql Server 作业编辑报错以及不显示历史记录
  2. Android studio 刷新文件状态
  3. fileviewfinder.php,Laravel在FileViewFinder.php中查找视图的错误处理程序
  4. shopee虾皮科技测试工程师第一次笔试
  5. SharePoint 2013 RBS(Remote BLOB Storag) 安装、部署、垃圾回收
  6. SpringBoot入门二
  7. python学习笔记(五)
  8. 51Talk联合创始人兼COO张礼明离职
  9. 苹果推出iCloud照片转移服务 能轻松转到谷歌相册
  10. Java多线程学习五:哪些场景需要额外注意线程安全问题及多线程也可能引起性能问题
  11. 2018贝壳找房研发校招笔试题
  12. kafka java 生产消费程序demo示例
  13. 开课吧Java课堂:如何使用迭代函数
  14. java 复制mysql某张表_java实现mysql数据库从一张表插入数据到另一张表
  15. html页面背景位置,html5background位置
  16. 图像分割(多分类)将mask变为one hot label
  17. Python打包exe,以及解决闪退
  18. 回溯法 子集和问题
  19. 我,90后,从审计员到程序员,四年在南京买房
  20. CSS3阴影 box-shadow的使用和技巧总结

热门文章

  1. yii2 如何用命名空间方式使用第三方类库
  2. Google OAUTH + OpenID 给第三方授权
  3. 运算器和控制器在计算机的作用,运算器和控制器功能作用(修改版).ppt
  4. python 常微分方程 画向量场_用scipy-odein在python中求解向量常微分方程
  5. 海外apk转换aab 十步流程
  6. 【AGC001E】BBQ Hard(图论,dp)
  7. 国内十大开源linux社区
  8. php dwz,PHP中的短网址怎么利用DWZ.CN服务进行生成
  9. BLE_BQB Test_Stable Modulation Characteristics at 2 Ms/s_RF-PHY/TRM/BV-11-C
  10. 前端学习笔记一:HTML(1)预备知识及一个简单的网页