ThreadLocal key 弱引用 代码
时间: 2023-10-14 22:31:12 浏览: 96
在Java中,ThreadLocal类可以让每个线程都拥有自己的变量副本,避免线程安全问题。在ThreadLocal中,使用一个Entry数组来存放每个线程对应的值,其中Entry的key为弱引用,value为强引用。这样,当ThreadLocal实例被垃圾回收时,对应的Entry数组也会被清理掉,从而避免内存泄漏问题。
以下是一个使用ThreadLocal的示例代码,其中ThreadLocal的key为弱引用:
```java
public class MyThreadLocal<T> {
private Map<Thread, T> threadMap = new HashMap<>();
private ThreadLocal<Map<Thread, T>> threadLocal = new ThreadLocal<Map<Thread, T>>() {
@Override
protected Map<Thread, T> initialValue() {
return new HashMap<>();
}
};
public void set(T value) {
threadMap.put(Thread.currentThread(), value);
threadLocal.set(threadMap);
}
public T get() {
Map<Thread, T> map = threadLocal.get();
return map.get(Thread.currentThread());
}
public void remove() {
Map<Thread, T> map = threadLocal.get();
map.remove(Thread.currentThread());
}
}
```
在上述代码中,我们使用了一个Map来存放每个线程对应的值,并且将这个Map设置到ThreadLocal中。在set方法中,我们将当前线程和对应的值存放到这个Map中,并且更新ThreadLocal的值。在get方法中,我们获取ThreadLocal中对应的Map,并且返回当前线程对应的值。在remove方法中,我们获取ThreadLocal中对应的Map,并且移除当前线程对应的值。由于ThreadLocal的key为弱引用,因此当ThreadLocal实例被垃圾回收时,对应的Entry数组也会被清理掉,从而避免内存泄漏问题。
阅读全文