假设系统包含2个线程。其中一个与ThreadLocal交互,而另一个则没有。
ThreadLocal在不与ThreadLocal交互的类中会发生什么?
答案 0 :(得分:1)
来自Javadoc:
protected T initialValue()
当线程第一次使用get()方法访问变量时,将调用此方法,除非线程先前调用了set(T)方法,在这种情况下,不会为线程调用initialValue方法。通常,每个线程最多调用一次此方法,但如果后续调用remove()后跟get(),则可以再次调用此方法。
这表明ThreadLocal仅针对与其交互的线程进行初始化。
关于你的第二个问题(它是否耗尽了任何资源),答案很可能取决于操作系统。
答案 1 :(得分:1)
来自javadoc:
each thread that accesses one (via its get or set method) has its own,
independently initialized copy of the variable.
每个Thread
实例(来自Thread.currentThread()
)都会保存与其互动的ThreadLocal
个对象的地图。它有一个字段threadLocals
,每个实例都在Thread
实例中初始化。
答案 2 :(得分:1)
只有一个ThreadLocal对象。每个Thread都有一个懒惰的初始化的所有初始化ThreadLocal对象的值映射。这意味着只有第一个Thread会有一个带有一个值的额外Map对象,并且第二个线程没有任何改变。
有关详细信息,请参阅ThreadLocal.setInitialValue():
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
和ThreadLocal.set():
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}