ThreadLocal是线程局部变量,同一份变量在每一个线程中都保存一份副本,彼此线程之间操作互不影响
测试ThreadLocal
package com.alibaba.fescar.core.protocol.test;
public class TestThreadLocal {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
threadLocal.set(100);
new Thread(()->{
threadLocal.set(200);
System.out.println("子线程"+threadLocal.get());
}).start();
System.out.println("主线程" + threadLocal.get());
}
}
输出结果
如果子线程不设置ThreadLocal的值,那么get出来的是个什么值呢,将是个null值
ThreadLocal机制
实际上,真正起作用的是ThreadLocalMap,介绍下这个ThreadLocalMap
- 这个Map的Key是ThreadLocal,vlaue是泛型值
- ThreadLocalMap维护在Thread类中
- ThreadLocalMap的创建是懒加载创建
下面是Thread类源码,可以看到Thread中维护