ThreadLocal
1.ThreadLocal原理
ThreadLocal,连接ThreadLocalMap和Thread。来处理Thread的TheadLocalMap属性,包括init初始化属性赋值、get对应的变量,set设置变量等。通过当前线程,获取线程上的ThreadLocalMap属性,对数据进行get、set等操作。
ThreadLocalMap,用来存储数据,采用类似hashmap机制,存储了以threadLocal为key,需要隔离的数据为value的Entry键值对数组结构。
ThreadLocal,有个ThreadLocalMap类型的属性,存储的数据就放在这儿。
2.ThreadLocal的API
- set(T t)方法:在当前线程中,往ThreadLocal对象中存入一个数据
- get()方法:在当前线程中,从ThreadLocal对象中取出数据
- remove()方法: 移除ThreadLocal中保存的当前线程的数据
3.测试
public class TestThreadLocalDemo { public static void main(String[] args) { //ThreadLocal是一个在同一个线程中共享数据的容器 // 它底层维护了一个Map,map的key就是线程Thread,它的value就是该县城需要存储的数据 ThreadLocal<String> threadLocal = new ThreadLocal<>(); threadLocal.set("张三"); threadLocal.set("李四"); threadLocal.set("王五"); threadLocal.set("赵六"); new Thread(()->{ threadLocal.set("孙七"); System.out.println("key为new Thread的新线程的value为"+threadLocal.get()); }).start(); new Thread(()->{ threadLocal.set("高八"); System.out.println("key为new Thread的新线程的value为"+threadLocal.get()); }).start(); System.out.println("key为默认的主线程的value为"+threadLocal.get()); } }
测试结果:
4.结论
一个ThreadLocal对象,在一个线程中只能存储一个数据,在该线程的任何地方调用get()方法获取到的都是同一个数据