ThreadLocal:本质上是线程内部的ThreadMap的key指向了它
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value);
} else {
createMap(t, value);
}
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
//实质就是再线程的内部有一个ThreadLocalMap 这个map以ThreadLocal为key,set的内容为value
//ThreadLocalMap解决哈希冲突的方式是线性探测法 如果当前数组位有值,则判断下一个数组位是否有值,如果有值继续向下寻找,直到一个为空的数组位
private Entry[] table;
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}
//继承了一个弱引用 下次gc就回收了
//两个值 ThreadLocal为key 这里是一个弱引用 一旦别的地方的强引用释放了之后 这里就会在下一次gc的时候释放
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
浅谈ThreadLocal
最新推荐文章于 2023-03-22 17:26:56 发布