一、ThreadLocal
线程变量,THreadLocal中填充的变量属于当前线程,该变量对于其他线程而言是隔离的,也就是说该变量是当前线程独有的变量,ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程都可以访问自己内部的副本变量
ThreadLoal变量,线程局部变量,同一个ThreadLOcal所包含的对象在不同的Thread中有不同的副本
因为每个Thread内有自己的实例副本,且实例副本只能由当前Thread使用
每个Thread都有自己的实例副本,且其它Thread不可访问,那么就不存在多线程共享的问题
ThreadLocal提供了线程本地的实例,它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本,ThreadLocal变量通常被private static修饰,当一个线程结束时,它所用的所有ThreadLocal相对的实例副本都可被回收
Threadlocal使用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,
常用方法:
set()
public void set(T value) {
//1、获取当前线程
Thread t = Thread.currentThread();
//2、获取线程中的属性 threadLocalMap ,如果threadLocalMap 不为空,
//则直接更新要保存的变量值,否则创建threadLocalMap,并赋值
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
// 初始化thradLocalMap 并赋值
createMap(t, value);
}
get()
public T get() {
//1、获取当前线程
Thread t = Thread.currentThread();
//2、获取当前线程的ThreadLocalMap
ThreadLocalMap map = getMap(t);
//3、如果map数据不为空,
if (map != null) {
//3.1、获取threalLocalMap中存储的值
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
//如果是数据为null,则初始化,初始化的结果,TheralLocalMap中存放key值为threadLocal,值为null
return setInitialValue();
}
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
remove()
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
学习: