关于"ThreadLocal"的内部设计
About the internal design of "ThreadLocal"
刚刚研究了Java ThreadLocal的源码,有两个问题,希望大家帮帮我!
首先,为什么不直接使用one Map
来存储所有值,而不是将map绑定到一个线程?像这样:
public class ThreadLocal<T> {
private ConcurrentHashMap<Thread, T> threadAndVal = new ConcurrentHashMap<>();
// get value from threadAndVal.... put value to threadAndVal
}
而在方法set(T value)中,我没有看到任何同步策略。这是线程安全的吗?
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value); // ⬅️Why createMap is thread safe?
}
感谢您的帮助!
为什么不用ConcurrentHashMap
?
主要原因是性能。使用线程安全映射比使用没有线程安全的自定义映射要慢得多。
第二个原因是只要 ThreadLocal
存在,Map<Thread,T>
就会保留对线程和值的引用,并且它们通常用作静态变量。
第三个有趣的原因是,我可以创建一个 Thread
并覆盖 equals
和 hashCode
,它的行为很顽皮。
ThreadLocal.set
是线程安全的吗?
不需要。第一行是:
Thread t = Thread.currentThread();
其他一切都在 Thread
t
上完成。所有这些操作只能从那个线程完成。
刚刚研究了Java ThreadLocal的源码,有两个问题,希望大家帮帮我!
首先,为什么不直接使用one Map
来存储所有值,而不是将map绑定到一个线程?像这样:
public class ThreadLocal<T> {
private ConcurrentHashMap<Thread, T> threadAndVal = new ConcurrentHashMap<>();
// get value from threadAndVal.... put value to threadAndVal
}
而在方法set(T value)中,我没有看到任何同步策略。这是线程安全的吗?
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value); // ⬅️Why createMap is thread safe?
}
感谢您的帮助!
为什么不用ConcurrentHashMap
?
主要原因是性能。使用线程安全映射比使用没有线程安全的自定义映射要慢得多。
第二个原因是只要 ThreadLocal
存在,Map<Thread,T>
就会保留对线程和值的引用,并且它们通常用作静态变量。
第三个有趣的原因是,我可以创建一个 Thread
并覆盖 equals
和 hashCode
,它的行为很顽皮。
ThreadLocal.set
是线程安全的吗?
不需要。第一行是:
Thread t = Thread.currentThread();
其他一切都在 Thread
t
上完成。所有这些操作只能从那个线程完成。