gpt4 book ai didi

java - 为什么 java.lang.ThreadLocal 是 Thread 上的映射而不是 ThreadLocal 上的映射?

转载 作者:行者123 更新时间:2023-11-29 09:46:35 32 4
gpt4 key购买 nike

天真地,我希望 ThreadLocal 是 Thread 到值类型的某种 WeakHashMap。所以当我了解到一个 ThreadLocal 的值实际上是 saved in a map in the Thread 时,我有点疑惑。 .为什么这样做呢?我希望 resource leaks如果值保存在 ThreadLocal 本身中,则与 ThreadLocal 关联的内容将不存在。

澄清:我在想类似的事情

public class AlternativeThreadLocal<T> { 
private final Map<Thread, T> values =
Collections.synchronizedMap(new WeakHashMap<Thread, T>());
public void set(T value) { values.put(Thread.currentThread(), value); }
public T get() { return values.get(Thread.currentThread());}
}

据我所知,这将防止出现奇怪的问题,即如果值以某种方式强烈引用 ThreadLocal 本身,那么在 Thread 死亡之前,ThreadLocal 及其遗留值都不会被垃圾回收。(当 ThreadLocal 是值引用的类上的静态变量时,可能会出现这种情况最不正当的形式。现在您在应用程序服务器中重新部署时会发生很大的资源泄漏,因为既不能收集对象也不能收集它们的类。)

最佳答案

有时,您只需提出一个问题就会得到启发。 :-) 现在我只看到了一个可能的答案:线程安全。如果具有值的映射在 Thread 对象中,则插入新值通常是线程安全的。如果映射在 ThreadLocal 上,您会遇到常见的并发问题,这可能会减慢速度。 (当然,您会使用 ReadWriteLock 而不是同步,但问题仍然存在。)

关于java - 为什么 java.lang.ThreadLocal 是 Thread 上的映射而不是 ThreadLocal 上的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829046/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com