专栏首页好派笔记ThreadLocal类的工作中的ThreadLocalMap(内部类)
原创

ThreadLocal类的工作中的ThreadLocalMap(内部类)

 首先,在Thread类中有一行:

    /* ThreadLocal values pertaining to this thread. This map is maintained by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;

  其中ThreadLocalMap类的定义是在ThreadLocal类中,真正的引用却是在Thread类中。同时,ThreadLocalMap中用于存储数据的entry定义:

        static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

  从中我们可以发现这个Map的key是ThreadLocal类的实例对象,value为用户的值,并不是网上大多数的例子key是线程的名字或者标识。ThreadLocal的set和get方法代码:

    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ThreadLocal与Java引用类型(文末含福利)

    今天以 “TheadLocal 为什么会导致内存泄漏” 为题与朋友们讨论了一波,引出了一些原理性的内容,本文就这个问题作答,并扩展相关的知识点

    Android扫地僧
  • 平时常说的ThreadLocal,今天就彻底解决它

    ThreadLocal是多线程处理中非常重要的一个工具,比如数据库连接池存放Connection、存放本地参数等作用,面试也经常会问到它的应用及原理,本文就将从...

    beifengtz
  • 抛出这8个问题,检验一下你到底会不会ThreadLocal,来摸个底~

    ThreadLocal类是用来提供线程内部的局部变量。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。

    Java编程指南
  • Java多线程编程-(10)-看了这篇关于ThreadLocal的原理应该透彻了

    ThreadLocal可以说是笔试面试的常客,每逢面试基本都会问到,关于ThreadLocal的原理以及不正当的使用造成的OOM内存溢出的问题,值得花时间仔细研...

    Java后端技术
  • Java线程封闭

    将ThreadLocal变量定义成private static的,这样的话ThreadLocal的生命周期就更长,由于一直存在ThreadLocal的强引用,所...

    入门小站
  • 详细领悟ThreadLocal变量

    关于对ThreadLocal变量的理解,我今天查看一下午的博客,自己也写了demo来测试来看自己的理解到底是不是那么回事。从看到博客引出不解,到仔细查看Thre...

    java思维导图
  • Android 一起来看看 ThreadLocal

    ThreadLocal 是一个线程内部的数据存储类,通过它可以在 指定的线程中 存储数据,数据存储以后,只有在指定线程中可以获取到存储的数据,对于其他线程来说则...

    developerHaoz
  • ThreadLocal的应用场景和注意事项有哪些?

    最近一个小伙伴把项目中封装的日期工具类用在多线程环境下居然出了问题,来看看怎么回事吧

    Java识堂
  • ThreadLocal原理——实现多个线程从同一个对象获取相同类型对象实例

    ThreadLocal,网传可以实现多线程变量安全共享。其实它只是一个半成品,其本身并没有提供变量安全共享,它实现了一个多线程从同一个对象获取相同类型对象实例的...

    zhangheng
  • 【JavaP6大纲】多线程篇:ThreadLocal 是什么?工作原理是什么?如何解决 Hash 冲突?内存泄露是怎么回事?为什么key 是弱引用?应用场景有哪些?

    ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无...

    java_wxid
  • 何时该使用 ThreadLocal,它的工作原理是什么(面试必背)?

    ThreadLocal 的概念,面试的时候容易被问到。它的概念很简单,从类的名字就可以知道,线程本地变量的意思。即该变量运行在线程中时,每个线程都独立拥有它而不...

    水货程序员
  • 给当前Thread类对象初始化ThreadlocalMap属性

    也就是如果把一个共享的对象直接保存到ThreadLocal中,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。 ...

    好派笔记
  • 浅析ThreadLocal

    上图可以看出ThreadLocal类中通过ThreadLocalMap去存储,ThreadLocalMap中的存储结构为Entry数组.

    LiosWong
  • 深入JDK源码之ThreadLocal类

    ThreadLocal概述 学习JDK中的类,首先看下JDK API对此类的描述,描述如下: 该类提供了线程局部 (thread-local) 变量。这些变量不...

    用户1263954
  • 聊一聊 Spring 中的线程安全性

    Spring与线程安全 Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并没有保证这些对象的线程安全,需要由开发...

    企鹅号小编
  • ThreadLocal分析

    ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状...

    爱撸猫的杰
  • ThreadLocal 类

    ThreadLocal 并不是一个Thread,而是 ThreadLocalVariable(线程局部变量)。也许把它命名为 ThreadLocalVar更加合...

    Java架构师必看
  • 面试再问ThreadLocal,别说你不会

    以前面试的时候问到ThreadLocal总是一脸懵逼,只知道有这个哥们,不了解他是用来做什么的,更不清楚他的原理了。表面上看他是和多线程,线程同步有关的一个工具...

    田维常
  • ThreadLocal 原理和使用场景分析

    ThreadLocal 不知道大家有没有用过,但至少听说过,今天主要记录一下 ThreadLocal 的原理和使用场景。 使用场景 直接定位到 Threa...

    古时的风筝

作者介绍

好派笔记

秦皇岛经济技术开发区易云软件开发服务部技术总监

秦皇岛经济技术开发区易云软件开发服务部 · 技术总监 (已认证)

专栏

精选专题

活动推荐

扫码关注云+社区

领取腾讯云代金券