ThreadLocal与InheritableThreadLocal的使用
ThreadLocal
ThreadLocal只能够获取到当前线程的中set的数据,其他线程(包括子线程)访问到该线程的数据
public void threadLocalTest() {
ThreadLocal<String> threadLocal = new ThreadLocal<>();
threadLocal.set("aaa");
System.out.println("-------初次set后threadLocal中变量的值-------------" + threadLocal.get());
new Thread(() -> {
String name = Thread.currentThread().getName();
System.out.println("----子线程【"+ name + "】-------获取到threadLocal中变量的值--------" + threadLocal.get());
}).start();
}
输出结果:
-------初次set后threadLocal中变量的值-------------aaa
----子线程【Thread-0】-------获取到threadLocal中变量的值--------null
InheritableThreadLocal
InheritableThreadLocal中的变量值只有当前线程及其子线程可以访问到,其他线程无法访问到该线程中的数据
public void inheritableThreadLocalTest01() {
ThreadLocal<String> threadLocal = new InheritableThreadLocal<>();
threadLocal.set("aaa");
System.out.println("-------初次set后threadLocal中变量的值-------------" + threadLocal.get());
new Thread(() -> {
String name = Thread.currentThread().getName();
System.out.println("----子线程【"+ name + "】-------获取到threadLocal中变量的值--------" + threadLocal.get());
}).start();
}
输出结果:
-------初次set后threadLocal中变量的值-------------aaa
----子线程【Thread-0】-------获取到threadLocal中变量的值--------aaa
注意:当子线程启动起来后,在修改父线程中变量的值,子线程无法获取到修改后的变量值,如下:
现在threadLocal变量中set一个string aaa,启动一个子线程,子线程在1s后获取线程中变量的值,
在这个1s的时间内,主线程修改了threadLocal中的变量的值
public void inheritableThreadLocalTest02() {
ThreadLocal<String> threadLocal = new InheritableThreadLocal<>();
threadLocal.set("aaa");
System.out.println("-------初次set后threadLocal中变量的值-------------" + threadLocal.get());
new Thread(() -> {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
String name = Thread.currentThread().getName();
System.out.println("----子线程【"+ name + "】-------获取到threadLocal中变量的值--------" + threadLocal.get());
}).start();
threadLocal.set("bbb");
System.out.println("----------更新后threadLocal中变量的值-----------"+ threadLocal.get());
}
输出结果如下:
-------初次set后threadLocal中变量的值-------------aaa
----------更新后threadLocal中变量的值-----------bbb
----子线程【Thread-0】-------获取到threadLocal中变量的值--------aaa
发现子线程中从threadlocal中获取到变量值仍为threadlocal中初次set进去的变量数据