ThreadLocal
ThreadLocal会为每一个调用它的线程创建一个变量副本,每个线程使用自己的副本并对其进行操作,不会影响到其他的线程的变量副本的值。
方法:
- set:设置该线程ThreadLocal副本中的值
- get:获取该线程ThreadLocal副本中的值
- initialValue:可以在创建ThreadLocal时重写该方法,设置初值。
- withInitial:设置ThreadLocal的初值。
ThreadLocal local = new ThreadLocal<>(){
protected Integer initialValue(){
return 200;
}
}
ThreadLocal local = ThreadLocal.withInitial(()->200);
例子
public class test{
private static ThreadLocal<Integer> threadlocal = new ThreadLocal<>();
public static void main(String[] args){
//设置mian线程中ThreadLocal的值
threadlocal.set(2);
System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());
//开启新线程
new Thread(()->{
//设置新线程线程中ThreadLocal的值
threadlocal.set(200);
System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());
}
System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());
}
}
输出:main->2
Thread-0->200
main->2
InheritableThreadLocal
在线程中创建的子线程的InheritableThreadLocal的值和创建它的父线程的值相同。即在父线程中创建子线程时,会把父线程的InheritableThreadLocal拷贝一份给子线程。
public class test{
private static ThreadLocal<Integer> threadlocal = new InheritableThreadLocal<>();
public static void main(String[] args){
//设置mian线程中InheritableThreadLocal的值
threadlocal.set(2);
System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());
//线程由main线程开启(继承mian线程中InheritableThreadLocal的值)
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"->"+thraedlocal.get());
}
}
}
输出: main->2
Thread-0->2
来源:https://blog.csdn.net/Lemon_MY/article/details/100806792