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。
