JUC思维导图:https://naotu.baidu.com/file/89fb28b05e3395800f9dc2d332d2b198?token=9b45e08e55281667
因为是引用,所以ThreadLocal会有两种状况。1,基本类型,2 引用类型
基本类型
static ThreadLocal<Integer> threadLocal =new ThreadLocal<Integer> (){
@Override
protected IntegerinitialValue() {
return 0;
}
};
//此时 get() 拿出来(可以理解为局部变量),所以有了自己独立对象
Integer num = threadLocal.get();
for (int j = 0; j <5 ; j++) {
num++;
}
引用类型
static class Person{
int id;
}
static Person p1=new Person();
static ThreadLocal<Person> threadLocal =new ThreadLocal<Person> (){
@Override
protected Person initialValue() {
return p1;
}
};
// 因为是引用,所有线程都指向了 p1,并不算独立的 变量
//解决初始化方法改为 return new Person();
这样每个线程都是独立的变量
—— ————————————————————————————————————————————————————————————————————
ThreadLocal : 每个线程都有自己的局部变量,它独立于变量的初始化副本。
两种使用方法:
1,
static ThreadLocal<User> holder =new ThreadLocal<>();
holder.set(user);
2, 重写初始值
static ThreadLocal<Integer> threadLocal =new ThreadLocal<Integer> (){
@Override
protected Index initialValue() {
return 0;
}
};
两种作用:
1,独立于初始变量,线程有自己一份变量操作可以 线程安全。 //适用于工具类
2,一个线程内所有方法共享变量,减少传参。 // 适用于拦截器
主要方法
initialValue() ,初始化变量
set() 存放变量,
get() 取变量
remove() 移除变量,不用的变量要及时移除,