深入剖析ThreadLocal源代码(二)
2024-01-01 20:39:14
前言
在上文《ThreadLocal 源码解析(一)》中,我们结合源码分析了ThreadLocal线程隔离的原理,以及ThreadLocalMap的取数据和删数据的流程。本文将紧接上文,结合源码继续分析ThreadLocal的set、initialValue、createMap等方法,以及WeakHashMap在ThreadLocalMap中的应用。通过本文,您将全面理解ThreadLocal的工作原理。
set方法分析
set方法用于设置当前线程中与当前ThreadLocal变量关联的值。它的源码如下:
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
从源码中可以看出,set方法首先获取当前线程,然后通过getMap方法获取当前线程对应的ThreadLocalMap。如果ThreadLocalMap不为空,则直接调用ThreadLocalMap的set方法设置值。如果ThreadLocalMap为空,则调用createMap方法创建ThreadLocalMap,并设置值。
initialValue方法分析
initialValue方法用于获取当前线程中与当前ThreadLocal变量关联的初始值。它的源码如下:
public T initialValue() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null && e.value != null)
return e.value;
}
return null;
}
从源码中可以看出,initialValue方法首先获取当前线程,然后通过getMap方法获取当前线程对应的ThreadLocalMap。如果ThreadLocalMap不为空,则调用ThreadLocalMap的getEntry方法获取当前ThreadLocal变量对应的Entry。如果Entry不为空,并且Entry的value不为空,则返回Entry的value。否则,返回null。
createMap方法分析
createMap方法用于创建ThreadLocalMap。它的源码如下:
private void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
从源码中可以看出,createMap方法首先创建一个新的ThreadLocalMap对象,然后将其设置到当前线程的threadLocals字段。
WeakHashMap在ThreadLocalMap中的应用
ThreadLocalMap中使用WeakHashMap来存储ThreadLocal变量和其关联的值。这是因为ThreadLocal变量是线程局部变量,当线程结束时,其对应的ThreadLocal变量和值也会被回收。WeakHashMap可以确保当线程结束时,其对应的ThreadLocal变量和值也会被回收,从而避免内存泄漏。
结语
通过本文的分析,我们已经全面理解了ThreadLocal的工作原理。希望本文对您有所帮助。