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()方法获取到的都是同一个数据