ThreadLocalMap 弱引用 源码
时间: 2023-10-13 10:19:06 浏览: 68
ThreadLocal_ThreadLocal源码分析_
ThreadLocalMap 是 ThreadLocal 类中的一个内部类,用于存储每个线程的 ThreadLocal 变量。在实现上,它是一个 hash 表,key 为 ThreadLocal 对象,value 为对应线程的变量值。
ThreadLocalMap 使用 Entry 内部类来表示每个键值对,Entry 继承自弱引用 WeakReference,这意味着当 ThreadLocal 对象被回收时,其在 ThreadLocalMap 中对应的键值对也会被自动删除,从而避免内存泄漏。
以下是 ThreadLocalMap 的部分源码:
```java
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
/**
* The table, resized as necessary. Length MUST Always be a power of two.
*/
private Entry[] table;
/**
* The number of entries in the table.
*/
private int size = 0;
/**
* The next size value at which to resize (capacity * load factor).
*/
private int threshold;
/**
* The load factor for the hash table.
*/
private static final double LOAD_FACTOR = 0.75;
/**
* Set the value associated with key.
*/
private void set(ThreadLocal<?> key, Object value) {
// ...
}
/**
* Remove the entry for key.
*/
private void remove(ThreadLocal<?> key) {
// ...
}
/**
* Get the value for key.
*/
private Object get(ThreadLocal<?> key) {
// ...
}
```
在 set、remove 和 get 方法中,ThreadLocalMap 会先通过 Thread.currentThread() 获取当前线程,然后通过 ThreadLocal 的 hashCode() 方法计算出在 hash 表中对应的位置。如果该位置为空,则新建一个 Entry 对象并存储;否则,直接修改或返回该位置上的值。
需要注意的是,在 set 和 remove 方法中,ThreadLocalMap 会通过 expungeStaleEntries() 方法清除已经被回收的键值对,这也是为了避免内存泄漏。
阅读全文