详细介绍ThreadLocal

发表于:2011-9-07 09:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:niumd    来源:51Testing软件测试网采编

  调用get方法如果此Map不存在首先初始化,创建此map,将线程为key,初始化的vlaue存入其中,注意此处的initialValue,我们可以覆盖此方法,在首次调用时初始化一个适当的值。setInitialValue代码如下:

  Java代码

  • private T setInitialValue() {  
  • T value = initialValue();  
  • Thread t = Thread.currentThread();  
  • ThreadLocalMap map = getMap(t);  
  • if (map != null)  
  • map.set(this, value);  
  • else 
  • createMap(t, value);  
  • return value;  
  • }
  •   set方法相对比较简单如果理解以上俩个方法,获取当前线程的引用,从map中获取该线程对应的map,如果map存在更新缓存值,否则创建并存储,代码如下:

      Java代码:

  • public void set(T value) {  
  • Thread t = Thread.currentThread();  
  • ThreadLocalMap map = getMap(t);  
  • if (map != null)  
  • map.set(this, value);  
  • else 
  • createMap(t, value);  
  • }
  •   对于ThreadLocal在何处存储变量副本,我们看getMap方法:获取的是当前线程的ThreadLocal类型的threadLocals属性。显然变量副本存储在每一个线程中。

      Java代码:

  • /**  
  • * 获取线程的ThreadLocalMap 属性实例  
  • */ 
  • ThreadLocalMap getMap(Thread t) {  
  • return t.threadLocals;  
  • }
  •   上面我们知道变量副本存放于何处,这里我们简单说下如何被java的垃圾收集机制收集,当我们不在使用是调用set(null),此时不在将引用指向该‘map’,而线程退出时会执行资源回收操作,将申请的资源进行回收,其实就是将属性的引用设置为null。这时已经不在有任何引用指向该map,故而会被垃圾收集。

      希望通过本文对hreadLocal的介绍,能够给你带来帮助。

    22/2<12
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号