`
hz_chenwenbiao
  • 浏览: 1007868 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jdk6标准类库源码解读 之 java.lang(二) ThreadLocal<T>(转)

阅读更多

ThreadLocal<T>

  • ThreadLocal中的基本存储结构是ThreadLocalMap。其中使用到了一个基础对象:WeakReference<T>,WeakReference(弱引用)指当需要某个指向某对象的引用,但又不影响此对象的垃圾收集,应该使用此对象代替一般的 reference。即,这个对象在除了WeakReference以外没有其他引用指向时,可以被垃圾回收,此时弱引用会变为null值。
  • ThreadLocalMap使用和普通Map相同的方式,只是每个元素都是WeakReference的子类。保证线程回收时,对象能够被垃圾回收。
     static class Entry extends WeakReference<ThreadLocal> {
            /** The value associated with this ThreadLocal. */
            Object value;

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

 

 

  • ThreadLocal中的ThreadLocalMap是被注入存储到Thread中的。ThreadLocalMap的key是ThreadLocal本身(属性进行某种运算得到),而value是不同的ThreadLocal对应的set方法设置的值。每个Thread只会有一个ThreadLocalMap。需要注意的就是,ThreadLocal不是一个存储结构,也不会包含存储结构所以ThreadLocal可以理解为一个帮助线程存储数据的工具类。
  • public class Thread implements Runnable {
         ...
    
        /*
         * ThreadLocal values pertaining to this thread. This map is maintained by the ThreadLocal
         * class.
         */
        ThreadLocal.ThreadLocalMap threadLocals = null;
    
        ...
    }
    
    public class ThreadLocal<T> {
         ...
    
        public void set(T value) {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null)
                map.set(this, value);
            else
                createMap(t, value);
        }
    
        void createMap(Thread t, T firstValue) {
            t.threadLocals = new ThreadLocalMap(this, firstValue);
        }
        ...
    }

     

    get方法是直接取当前Thread的ThreadLocalMap中,当前ThreadLocal对应的值。

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

     

     

    出处:http://wu-sheng.iteye.com/blog/946240

    分享到:
    评论

    相关推荐

      jdk10+ java.lang.NoClassDefFoundError: javax/xml/ws/Service 错误

      在Java开发过程中,我们经常会遇到`java.lang.NoClassDefFoundError`这个异常,尤其是在进行JDK版本升级时。这个错误通常表示在运行时找不到某个类的定义,即使编译时该类是可用的。在本例中,问题发生在从一个较低...

      java.lang.UnsupportedClassVersionError问题解决

      ### java.lang.UnsupportedClassVersionError问题解析与解决方案 在Java开发过程中,经常会在部署或运行时遇到`java.lang.UnsupportedClassVersionError`错误。该错误通常发生在类文件版本与JVM(Java虚拟机)版本...

      基于JSP新闻发布系统

      &lt;br&gt;&lt;br&gt;本系统是WEB模式的新闻发布管理系统&lt;br&gt;运行环境:Tomact+JDK&lt;br&gt;编程模式:JSP+JavaBean+JavaServlet&lt;br&gt;后台数据库:MySql\Access&lt;br&gt;&lt;br&gt;系统主要完成的功能如下:&lt;br&gt;&lt;br&gt;管理员(后台)&lt;br&gt;.系统管理:用户...

      基于JSP的实验室教学管理系统

      实验室教学管理系统(Web版 全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...

      java反编译工具jad 1.5.8g(可以反编译jdk1.5,1.6)

      For example:&lt;br&gt;&lt;br&gt; jad -o -dtest -sjava *.class&lt;br&gt;&lt;br&gt; (or jad -o -d test -s java *.class, which has the same effect)&lt;br&gt;&lt;br&gt;This command decompiles all .class files in the current directory &lt;br&gt;...

      java.lang.ClassNotFoundException异常的解决1

      在Java 6、7和8中,Java平台的标准版(Java SE)包含了Java企业版(Java EE)的一些API,如JAXB(Java Architecture for XML Binding)。然而,从Java 9开始,为了实现模块化并提高系统的可维护性和安全性,Java EE...

      JDK1.8【函数式接口】【定义与使用】【源码】

      JDK1.8【函数式接口】【定义与使用】【源码】 文章地址:https://blog.csdn.net/m0_37969197/article/details/124146253 * 函数式接口(类的定义与适应形式,只是一种类的定义形式,属于新增语法) * 包:java....

      实验室教学管理系统

      实验室教学管理系统(Web版 全套源码 安装即用)&lt;br&gt;&lt;br&gt;本系统是一个完整的JSP-JAVA应用项目,合适有初步JSP编程经验的朋友们提高和学习之用。&lt;br&gt;&lt;br&gt;系统含全套源码,合适朋友们在此基础上举一反三结合实际开发出...

      基于JSP的在线考试系统

      &lt;br&gt;&lt;br&gt;本系统是Web模式的在线考试管理系统&lt;br&gt;&lt;br&gt;运行环境:Tomact+JDK&lt;br&gt;&lt;br&gt;编程模式:JSP+JavaBean+JavaServlet&lt;br&gt;&lt;br&gt;后台数据库:MS-Access&lt;br&gt;&lt;br&gt;系统主要完成的功能如下:&lt;br&gt;&lt;br&gt;.基本信息管理 考生...

      jsp航空订票系统

      &lt;br&gt;&lt;br&gt;本系统是WEB模式的航空订票系统管理系统&lt;br&gt;运行环境:Tomact+JDK&lt;br&gt;编程模式:JSP+JavaBean+JavaServlet&lt;br&gt;后台数据库:MS-Access&lt;br&gt;&lt;br&gt;系统主要完成的功能如下:&lt;br&gt;&lt;br&gt; _订票信息管理功能 _客机信息...

      基于JSP的办公自动化系统

      &lt;br&gt;&lt;br&gt;本系统是Web模式的办公自动化系统&lt;br&gt;&lt;br&gt;运行环境:Tomact+JDK&lt;br&gt;编程模式:JSP+JavaBean+JavaServlet&lt;br&gt;后台数据库:MS-Access&lt;br&gt;&lt;br&gt;系统主要功能简介:&lt;br&gt;&lt;br&gt;.信息中心 &lt;br&gt;&lt;br&gt;.内部电子邮件&lt;br&gt;...

      (最终解决)java.lang.UnsatisfiedLinkError解决尝试

      Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库但找不到相应的库文件时。这个错误可能是由于多种原因引起的,如库路径设置不正确、库文件不存在或者版本...

      解决 java.lang.RuntimeException: Could not generate DH keypair异常处理所需的bcprov的jar

      解决 java.lang.RuntimeException: Could not generate DH keypair异常处理。 bcprov-ext-jdk15on-1.60、bcprov-jdk15on-1.60两个包放到jre下的$JAVA_HOME/jre/lib/ext的路径下,然后配置$JAVA_HOME/jre/lib/...

      解决java.lang.SecurityException: JCE cannot authenticate the provider BC问题

      在与银联的对接中,调试过程中报错或使用类似登入加密:java.lang.SecurityException: JCE cannot authenticate the provider BC 进行问题解决,里面包含 bcprov-jdk16-143.jar与bcprov-jdk15-135.jar与具体文件存放...

      java.lang.UnsupportedClassVersionError问题的解决方法

      - 在弹出的属性设置窗口中,选择左侧的“Build--&gt;Java”选项。 - 在右侧的界面中,你会看到四个下拉框,分别是“Compiler”、“Debug Option”、“Language Features”和“Target VM”。 - 对于“Compiler”和...

      spring boot2快速导出excel的java工具类demo源码:export-excel

      spring boot2快速导出excel的示例源码 操作系统:windows10 JAVA jdk:1.8 开发工具:IDEA java架构:spring boot 2.1.6 gitHub:https://github.com/cn-h-jar/exportexcel 作者:jar 运行提示: 启动项目...

      java.lang.OutOfMemoryError: PermGen space解决方案

      java.lang.OutOfMemoryError: PermGen space 解决方案

      aspose-words-16.8.0-jdk16.jar 亲测可用版,无水印

      &lt;Signature&gt;sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=&lt;/Signature&gt; ...

      Tomcat启动时报错:java.lang.UnsatisfiedLinkError的解决

      由于本机安装的jdk版本与tomcat中使用的jdk版本不一致导致的。 解决方法 后面我把原先tomcat启动环境用的jdk1.7改为了本机安装的jdk1.8就不在报错。 具体过程: 在myeclipse中点击window→preference→在搜索框中...

      jboss7.1.1下报java.lang.SecurityException: JCE cannot authenticate the provider BC

      标题中的“jboss7.1.1下报java.lang.SecurityException: JCE cannot authenticate the provider BC”是一个典型的Java安全异常,通常发生在尝试使用不受信任的加密提供者时。在这个问题中,"BC"指的是Bouncy Castle...

    Global site tag (gtag.js) - Google Analytics