`

关于漫谈设计模式4.2.3章节的一点申明

阅读更多
之前比较懒,对ThreadLocal代码未做细细研究,而是受一些影响,而导致对其产生了一些误解,最近考略到jvm对classloader的回收问题时,我才意识到可能犯了一个错误,我把这个错误写在博文里,链接是http://redhat.iteye.com/blog/1057974,读者可以查阅该文章,关于这个章节的一点错误,如果我的书籍能够出版的话,我将在里面进行更新,或者我会给出新版本电子书籍,如果可能的话。

对于这个章节出现的问题,我深表歉意!
为了方便阅读,我把论坛的帖子放在这里。
引用

                  ThreadLocal的误解

文章分类:Java编程
可能大部分人的想法和我当初的想法一样,都是以为在ThreadLocal里使用一个Map,这个Map的键为Thread,值为绑定的变量。其实如果这样做是有问题的:
1. 就是当线程回收时,该线程绑定的变量不能被自动的回收,因为变量存储在ThreadLocal里,必须显式的去回收。如果此变量存储在线程里,那么线程回收时,这个变量没有被其他引用指向的话,它便随着线程一起回收。
2. 另外不这样做还有一个好处:如果Map在ThreadLocal里,那你必须得考虑线程同步访问这个Map,但是这确实没有必要,因为线程访问自己的变量,和其他线程没有直接的关系,所以把Map放在线程里,就不需要做同步的处理,这样即加快了访问的速度。

其实实现不是这样的:每个线程都包含一个ThreadLocal.ThreadLocalMap变量threadLocals(延迟创建的),这个映射(Map)目的就是为每个线程存储关联到使用到的不同ThreadLocal的变量,这个很好理解,因为,一个线程可能使用到多个不同的ThreadLocal对象,每一个ThreadLocal对象的值都被认为是不同的。于是,每次调用ThreadLocal的get()方法,其实就是获取当前线程(Thread.currentThread()),然后从threadLocals映射里,根据ThreadLocal对象,找出其关联的拷贝,这个值便是当前线程的,隔离于其他线程的值。

我们知道,ThreadLocal.ThreadLocalMap映射使用的键是被WeakReference包装的ThreadLocal对象,如果ThreadLocal对象没有其他强引用和软引用指向时,该线程也不会继续持有ThreadLocal对象,因为根据JVM规范,它会被垃圾回收器下次回收时销毁,这一定程度避免了内存泄露,但不表示不会出现内存泄露,关于ThreadLocal引起的内存泄露,特别是导致ClassLoader不能被回收,网上有很多文章都在讨论。在Java 1.5开始,加入了remove()方法,这样我们可以显式的调用此方法,释放内存,所以使用ThreadLocal要特别注意内存泄露的问题。

看来大家对ThreadLocal内存泄露的原因有点误解,其导致Classloader内存泄露的原因在这篇博文写的很清楚了Classloader leaks:,我在这里补充一下,jvm规范下的classloader能被回收的条件是,所有该classloader产生的所有对象都被回收了:我们知道,对象有一个隐式的引用指向它的类型class对象,而class对象有个隐式的引用指向它的classloader,所以如果有一个对象不回收,那么可能导致整个classloader不能够被回收。为什么是可能?这个是jvm规范规定的规范,但是实现并不尽相同,sun的hotspot目前版本是不会对还有不能回收对象的classloader做回收的,但是其他的jvm实现,比如Jrocket,ibm的jvm可能会产生回收那些无用的class对象,但目前没有看到源码,只能从现象猜测。线程池产生泄漏的一个原因主要可能是对线程重用产生的,这点读者有条件可以去测试。


特此申明一下,我的书籍http://redhat.iteye.com/admin/blogs/1007884关于4.2.3章节出现了纰漏,当我意识到错误时,花了1-2周来查看此问题,下载了sun jdk1.5版本,1.6版本,1.3版本,1.2版本,以及IBM的jdk代码进行比较,这个纰漏的申明在http://redhat.iteye.com/blog/1057991里,自己置顶,这个理解错误的原因是读取别人(老外)写的博文错误引起的,希望大家能够多读代码,谢谢!



8
1
分享到:
评论
3 楼 lingfa0511 2011-05-30  
今天刚好看到这节,支持楼主的学术精神!!!
2 楼 gudgudstudy 2011-05-29  
支持,顶!
1 楼 zqx888191 2011-05-26  
支持原创!

相关推荐

    tedddbyActivatorV4.2.3.rar

    tedddbyActivatorV4.2.3.rar

    extjs4.2.3

    EXTJS是一个广泛使用的JavaScript库,专为构建富客户端Web应用程序而设计,尤其在企业级应用中广泛应用。其主要特点是组件化、数据绑定、强大的表格和图表功能以及丰富的用户界面控件。 在EXTJS 4.2.3中,开发者...

    jboss-4.2.3.GA_下的jboss-4.2.3.GA_下的

    【JBoss 4.2.3.GA 概述】 JBoss AS 4.2.3.GA(Application Server)是Red Hat公司开发的一款开源Java应用服务器,它基于Java EE(Enterprise Edition)5规范,提供了全面的企业级服务,包括EJB(Enterprise ...

    jboss 4.2.3

    JBoss 4.2.3 是一个历史悠久的Java企业级应用服务器版本,它基于Java EE 5规范,为开发和部署企业级应用程序提供了强大的平台。在这个版本中,JBoss 提供了诸如Web服务、EJB(Enterprise JavaBeans)、JMS(Java ...

    csss手册4.2.3.chm

    csss手册4.2.3.chm

    CuteFTP4.2.3中文版

    CuteFTP 4.2.3 是一个早期版本的FTP客户端软件,专为中文用户设计。FTP(File Transfer Protocol)是一种用于在互联网上进行文件传输的标准协议,它允许用户从远程服务器上传、下载文件,或者在不同的服务器之间移动...

    hibernate-4.2.3.required

    1. **查询语言增强**:HQL(Hibernate Query Language)和 Criteria API 的进一步优化,支持更复杂的查询模式,使得开发者能更方便地与数据库交互。 2. **性能提升**:对内部缓存机制的优化,包括一级缓存和二级...

    官方highcharts-4.2.3版

    此外,Highcharts具有良好的响应式设计,图表能在不同尺寸的设备上自动调整布局,适应移动设备和桌面浏览器。 在4.2.3版本中,Highcharts可能已经解决了早期版本的一些已知问题,提升了性能和稳定性。官方文档通常...

    有springside4.2.3-GA.jar 包

    总的来说,springside4.2.3-GA.jar是Java开发者的重要资源,它提供了一个高效、稳定的开发环境,并且通过模块化的设计和最佳实践,使得Java企业级应用的开发变得更加轻松和高效。无论是初学者还是经验丰富的开发者,...

    AutoDock4.2.3相关资料

    AutoDock4.2.3是一款广泛应用的分子对接软件,它主要用于预测小分子与大分子之间的相互作用位置,特别是在药物发现和蛋白质-配体相互作用研究中占有重要地位。这款软件的最新版本4.2.3提供了更为精确的对接算法和...

    CSS V4.2.3语法属性

    **CSS(层叠样式表)**是Web开发中的核心组件之一,用于定义页面的布局和样式。CSS V4.2.3是一个版本更新,其中包含了更丰富的语法...通过学习和实践CSS V4.2.3的新特性,开发者可以提升网页设计的创新性和用户体验。

    httpmime-4.2.3、httpcore-4.2.2、httpclient-4.2.3

    3. **httpclient-4.2.3**: 这是整个HttpClient库的主要部分,提供了更高层次的API,用于执行HTTP请求并处理响应。开发者可以使用它来发送GET、POST等HTTP方法的请求,处理cookies,执行认证,处理重定向,甚至实现...

    JBOSS4.2.3 文件结构图

    ### JBoss 4.2.3 文件结构解析 JBoss AS 4.2.3是JBoss Application Server的一个版本,广泛应用于Java企业级应用程序的开发与部署。理解JBoss AS 4.2.3的文件结构对于管理和配置该服务器至关重要。下面我们将详细...

    zeromq-4.2.3.zip

    其核心特性是它能够模拟多种通信模式,包括请求-响应、发布-订阅以及推拉模式,使得开发者可以灵活地设计各种分布式应用。 ZeroMQ的核心设计理念是“零拷贝”(Zero-Copy),这意味着在传输数据时,它可以最小化...

    phpMyAdmin-4.2.3-all-languages.zip

    《phpMyAdmin 4.2.3 全语言版本详解》 phpMyAdmin 是一个非常流行的基于Web的MySQL数据库管理工具,它允许用户通过浏览器轻松地进行数据库的创建、修改和管理。在“phpMyAdmin-4.2.3-all-languages.zip”这个压缩包...

    httpclient4.2.3

    官方版 httpclient4.2.3 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 ...

    spring-framework-4.2.3.RELEASE

    首先,Spring框架的核心在于依赖注入(Dependency Injection,简称DI),这是一种设计模式,它允许开发者将对象的创建和管理权交给框架,降低了组件间的耦合度,提高了代码的可测试性和可维护性。4.2.3.RELEASE版本...

    css4.2.3手册.zip

    《CSS4.2.3手册》是一个专门为前端开发者和网页设计者准备的实用参考资料,它以小巧、便捷的形式,提供了全面且易于理解的CSS(层叠样式表)知识。这个压缩包内包含了一个CHM(Compiled Help Manual)文件,这是一种...

    jboss-4.2.3.GA.zip

    【JBoss 4.2.3.GA】是JBoss Application Server的一个稳定版本,它在2007年发布,提供了全面的企业级Java应用程序部署和支持。这个版本支持J2EE 1.4规范,包括EJB 2.1、JSF 1.1、JPA(Java Persistence API)和Web...

    jboss-4.2.3.GA

    jboss-4.2.3.GA

Global site tag (gtag.js) - Google Analytics