韩顺平-线程数据共享和安全ThreadLocal
- 什么是ThreadLocal?
- ThreadLocal环境搭建
- ThreadLocal快速入门
- ThreadLocal源码阅读
- threadLocal.set()源码
- threadLocal.get()源码
什么是ThreadLocal?
- ThreadLocal的作用: 可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.
- ThreadLocal可以给当前线程关联一个数据(普通变量, 对象, 数据) - set方法设置
- ThreadLocal可以像Map一样存取数据, key为当前线程 - get方法获取
- 每一个ThreadLocal对象, 只能为当前线程关联一个数据. 如果要为当前线程关联多个数据, 就需要使用多个ThreadLocal对象实例
- 每个ThreadLocal对象实例定义的时候, 一般为static类型
- ThreadLocal中保存的数据. 在线程销毁时. 会自动释放
ThreadLocal环境搭建
现象->分析原理->看源码进一步理解
- 创建java项目
- ThreadLocal类图
- 开启线程
ThreadLocal快速入门
ThreadLocal源码阅读
threadLocal.set()源码
解读set源码
public void set (T value){ //1.获取当前线程,关联到当前线程 Thread t = Thread.currentThread(); //2.通过线程对象, 获取到ThreadLocalMap, 是ThreadLocal的静态内部类 // ThreadLocalMap的类型是: ThreadLocal.ThreadLocalMap ThreadLocalMap map = getMap(t); //3.如果map不为空, 将数据(dog,pig...)放入map中, key:threadLocal, value:存放的数据 // 从这个源码我们已然看出一个threadLocal只能关联一个数据, 如果再次set(), 就会替换 //4. 如果map为空, 就创建一个和当前线程关联的ThreadLocalMap, 并且将该数据放入 if (map != null) { map.set(this, value); } else { createMap(t, value); } }
debug1 存储
debug2 替换
debug3
threadLocal.get()源码
解读get源码
public T get() { //1.得到当前的线程对象 Thread t = Thread.currentThread(); //2.得到线程的threadLocals属性, 即ThreadLocalMap ThreadLocalMap map = getMap(t); if (map != null) { //3.如果线程的threadLocals不为空, 根据当前的threadLocal对象, 得到对应的Entry ThreadLocalMap.Entry e = map.getEntry(this); //如果Entry不为空 if (e != null) { @SuppressWarnings("unchecked") //返回当前的threadLocal关联的数据 T result = (T)e.value; return result; } } return setInitialValue(); }