ThreadLocal如何实现线程局部变量存储的原理?

摘要:ThreadLocal 作用: 提供线程内局部变量,多线程场景下不同线程之间不会相互干扰。 ThreadLocal 实例通常来说都是 private static 修饰的,用于关联线程、线程上下文。 减少同一个线程内的函数 或 组件之间传递
ThreadLocal 作用: 提供线程内局部变量,多线程场景下不同线程之间不会相互干扰。 ThreadLocal 实例通常来说都是 private static 修饰的,用于关联线程、线程上下文。 减少同一个线程内的函数 或 组件之间传递变量的复杂性。 基本方法: demo: ThreadLocal处理多线程问题,将变量与线程绑定: public class ThreadLocalDemo { private String Msg; ThreadLocal<String> threadLocal = new ThreadLocal<>(); private String getMsg(){ return threadLocal.get(); } private void setMsg(String s){ threadLocal.set(s); } public static void main(String[] args) { ThreadLocalDemo threadLocalDemo = new ThreadLocalDemo(); for(int i =0;i<10;i++){ Thread thread = new Thread(new Runnable() { @Override public void run() { threadLocalDemo.setMsg(Thread.currentThread().getName()+"的数据"); System.out.println("--------------------------------------"); System.out.println(Thread.currentThread().getName()+", 保存的数据------>" + threadLocalDemo.getMsg()); } }); thread.start(); } } } 运行结果: Thread-0, 保存的数据------>Thread-0的数据 -------------------------------------- Thread-1, 保存的数据------>Thread-1的数据 -------------------------------------- Thread-2, 保存的数据------>Thread-2的数据 -------------------------------------- Thread-3, 保存的数据------>Thread-3的数据 -------------------------------------- Thread-4, 保存的数据------>Thread-4的数据 -------------------------------------- Thread-5, 保存的数据------>Thread-5的数据 -------------------------------------- Thread-6, 保存的数据------>Thread-6的数据 -------------------------------------- Thread-7, 保存的数据------>Thread-7的数据 -------------------------------------- Thread-9, 保存的数据------>Thread-9的数据 -------------------------------------- Thread-8, 保存的数据------>Thread-8的数据 验证可知,每个线程拿到的都是自己的数据。 ThreadLocal数据结构: ThreadLocal的设计是:每个Thread维护一个ThreadLocalMap哈希表,这个哈希表的key是ThreadLocal实例本身,value才是真正要存储的值Object。
阅读全文