Java之ThreadLocal
2022-07-06 17:33:11 8 举报
AI智能生成
Java之ThreadLocal
作者其他创作
大纲/内容
使用场景
每个线程独享一个对象
对象线程间隔离
每个线程内需要保存全局变量(例如在拦截器获取用户信息),可以让不同方法直接使用,避免参数传递麻烦
数据结构
Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals
每个线程有一个自己的ThreadLocalMap
ThreadLocalMap
简单地将它的key视作ThreadLocal,value为代码中放入的值(实际上key并不是ThreadLocal本身,而是它的一个弱引用)
每个线程在往ThreadLocal里放值的时候,都会往自己的ThreadLocalMap里存,读也是以ThreadLocal作为引用,在自己的map里找对应的key,从而实现了线程隔离
ThreadLocalMap中使用数组存储当前线程所有的ThreadLocal对象
注意Entry, 它的key是ThreadLocal<?> k ,继承自WeakReference, 也就是我们常说的弱引用类型
关键方法
ThreadLocalMap.set()
//获取当前线程
Thread t = Thread.currentThread();
//根据当前线程获取ThreadLocalMap,其实就是直接返回threadlocals属性
ThreadLocal.ThreadLocalMap map = getMap(t);
//如果threadlocals 不为空,就调用set方法进行存储,实际上转成Entry对象存储在table数组里
if (map != null)
map.set(this, value);
else
//初始化table,并将entry放入其中,赋值给threadlocals属性
createMap(t, value);
Thread t = Thread.currentThread();
//根据当前线程获取ThreadLocalMap,其实就是直接返回threadlocals属性
ThreadLocal.ThreadLocalMap map = getMap(t);
//如果threadlocals 不为空,就调用set方法进行存储,实际上转成Entry对象存储在table数组里
if (map != null)
map.set(this, value);
else
//初始化table,并将entry放入其中,赋值给threadlocals属性
createMap(t, value);
ThreadLocalMap.get()
//获取当前线程
Thread t = Thread.currentThread();
//根据当前线程获取ThreadLocalMap,其实就是直接返回threadlocals属性
ThreadLocal.ThreadLocalMap map = getMap(t);
if (map != null) {
//从threadlocals中获取当前ThreadLocal中对应的Entry对象,就是遍历table数据获取
ThreadLocal.ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
//返回entry中的value值
T result = (T) e.value;
return result;
}
}
//如果没有值,会调用creatMap初始化,即添加到threadlocals中,只不过value为null
return setInitialValue();
Thread t = Thread.currentThread();
//根据当前线程获取ThreadLocalMap,其实就是直接返回threadlocals属性
ThreadLocal.ThreadLocalMap map = getMap(t);
if (map != null) {
//从threadlocals中获取当前ThreadLocal中对应的Entry对象,就是遍历table数据获取
ThreadLocal.ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
//返回entry中的value值
T result = (T) e.value;
return result;
}
}
//如果没有值,会调用creatMap初始化,即添加到threadlocals中,只不过value为null
return setInitialValue();
Hash 算法
过期 key 清理
探测式清理
启发式清理
扩容机制
0 条评论
下一页