当前位置:   article > 正文

ThreadLocal是key,多线程时key是一样的,为什么值互不影响?

ThreadLocal是key,多线程时key是一样的,为什么值互不影响?

实际上,当我们在多线程环境中使用ThreadLocal时,虽然每个线程使用的是同一个ThreadLocal实例(即相同的key),但由于ThreadLocalMap是和线程绑定的,因此每个线程都有自己独立的ThreadLocalMap实例。

ThreadLocalget()set()方法会访问当前线程的ThreadLocalMap,这个映射表ThreadLocal实例作为键,与线程特定的值(value)相关联。由于每个线程都有自己的ThreadLocalMap,因此每个线程通过同一个ThreadLocal实例存取的值都是独立的。

这一点可以通过ThreadLocal的源码来进一步理解。在ThreadLocal类中,每个线程的ThreadLocalMap是作为Thread类的一个字段存在的。当你对ThreadLocal进行get()set()操作时,它会先获取当前线程(Thread.currentThread()),然后在当前线程对象内部查找或修改ThreadLocalMap

源码示例:

  1. public class ThreadLocal<T> {
  2. public T get() {
  3. Thread t = Thread.currentThread();
  4. ThreadLocalMap map = getMap(t);
  5. if (map != null) {
  6. ThreadLocalMap.Entry e = map.getEntry(this);
  7. if (e != null) {
  8. @SuppressWarnings("unchecked")
  9. T result = (T)e.value;
  10. return result;
  11. }
  12. }
  13. return setInitialValue();
  14. }
  15. // 其他方法...
  16. }

在上面的get()方法示例中,this代表当前ThreadLocal实例,作为映射的键,但是由于getMap(t)获取的是当前线程的ThreadLocalMap,所以不同线程看到的映射实际上是不同的。

因此,关键点在于虽然ThreadLocal实例是共享的,但是每个线程都有自己的ThreadLocalMap,所以它们保存的值是独立隔离的。这就是ThreadLocal为何能在多线程环境中保持线程局部变量独立性的原理。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/289907
推荐阅读
相关标签
  

闽ICP备14008679号