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

ThreadLocal源代码解析

    博客分类:
  • java
阅读更多

最开始的时候,理解的ThreadLocal,我的理解是这样的:

ThreadLocal<Thread,Map<k,v>> K的话是线程,V的话是线程的副本,是一个Map,里面可以方式多个变量的副本,后来发现是错的。

今天翻了一下代码,画了一个类图。



 

关于ThreadLocalMap.table这个属性,类型是Entry[]

用于真正存放数据的Entry,继承于WeakReference。想想ThreadLocal的使用场景,用“空间换时间”,若空间全部被强应用,则很容易造成内存泄露(使用结束后没有显示调用remove方法)。采用弱引用,在关键时刻,或在调用方没有显示的置空的情况下,也可回收部分内存,以便程序继续运行。其余基本都与HashMap的内部实现类似,内部都通过数组实现。而对键值key,HashMap存的是用户自定义的值,ThreadLocal存的线程对象hashcode值,仅此而已。

 

关于ThreadLocal中的方法

public void set(T value)

设置当前线程副本中的线程局部变量的值。

public T get()

返回此线程局部变量的当前线程副本中的值。

如果这是线程第一次调用该方法,则创建并初始化此副本。

public void remove()

移除此线程局部变量的值。

该方法是JDK 5.0新增的方法。目的是为了减少内存的占用。当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。

protected T initialValue()

返回此线程局部变量的当前线程的初始值。

线程第一次使用get()方法访问变量的时候。如果线程先于get方法调用set(T)方法,则不会在线程中再调用initialValue方法。该方法是一个protected的方法,显然是为了让子类覆盖而设计的。因该缺省实现只返回null;如果程序员希望将线程局部变量初始化为 null 以外的某个值,则必须为 ThreadLocal 创建子类,并重写此方法。

 

关于ThreadLocal属性的get操作

1、获得当前线程对象

2、从当前线程中获得ThreadLocalMap的引用

3、然后通过当前ThreadLocal属性的hashCode找到对应的Entry,Entry是一个数组,真正存放数据的地方,返回结果

 

使用ThreadLocal注意的问题

1、变量污染问题

在使用线程池的时候,要非常主要remove的操作,如果没有,一个线程处理完一个任务,之后处理另外一个任务,变量就会有问题。

2、内存问题

主要放入ThreadLocal中的数据大小,虽然是弱引用,但是也会导致GC问题的。

 

  • 大小: 70.4 KB
0
1
分享到:
评论
1 楼 cywhoyi 2014-05-08  
static是全局的,ThreadLocalMap才能发挥其如此大的作用,觉得这才是ThreadLocal为何能够线程副本,我觉得这是关键点。
至于GC问题,在膨胀的情况下,你用什么引用都有该问题

相关推荐

    Spring中文帮助文档

    ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.2.1. Mock对象 8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 8.3.3. ...

    Spring API

    ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.2.1. Mock对象 8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 8.3.3. ...

    spring chm文档

    ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量...

    Spring 2.0 开发参考手册

    目录 前言 1. 简介 1.1. 概览 1.2. 使用场景 2. Spring 2.0 的新特性 2.1. 简介 ... 源代码级的元数据类型 20.3.5. 接口AutodetectCapableMBeanInfoAssembler 20.3.6. 用Java接口定义管理接口 ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. ...

    day020-继承加强和设计模式代码和笔记.rar

    4. Properties资源(配置)文件的解析(重点) ---------------------------------(注意:重点)------------------------------------- 以后配置文件都要放到项目中的一个或者几个单独的文件夹中,为了好管理...

    java面试题及技巧4

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    Android开发艺术探索

    第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过...

    java面试题以及技巧

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    java面试题目与技巧1

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    java面试题及技巧3

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    java面试题以及技巧6

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    疯狂JAVA讲义

    1.5.1 编辑Java源代码 12 1.5.2 编译Java程序 13 学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢...

Global site tag (gtag.js) - Google Analytics