ThreadLocal的几种误区

最近由于需要用到ThreadLocal,在网上搜索了一些相关资料,发现对ThreadLocal经常会有下面几种误解

一、ThreadLocal是java线程的一个实现
     
ThreadLocal的确是和java线程有关,不过它并不是java线程的一个实现,它只是用来维护本地变量。针对每个线程,提供自己的变量版本,主要是为了避免线程冲突,每个线程维护自己的版本。彼此独立,修改不会影响到对方。

二、ThreadLocal是相对于每个session的

ThreadLocal顾名思义,是针对线程。在java
web编程上,每个用户从开始到会话结束,都有自己的一个session标识。但是ThreadLocal并不是在会话层上。其
实,Threadlocal是独立于用户session的。它是一种服务器端行为,当服务器每生成一个新的线程时,就会维护自己的
ThreadLocal。对于这个误解,个人认为应该是开发人员在本地基于一些应用服务器测试的结果。众所周知,一般的应用服务器都会维护一套线程池,也
就是说,对于每次访问,并不一定就新生成一个线程。而是自己有一个线程缓存池。对于访问,先从缓存池里面找到已有的线程,如果已经用光,才去新生成新的线
程。所以,由于开发人员自己在测试时,一般只有他自己在测,这样服务器的负担很小,这样导致每次访问可能是共用同样一个线程,导致会有这样的误解:每个
session有一个ThreadLocal

三、ThreadLocal是相对于每个线程的,用户每次访问会有新的ThreadLocal

理论上来说,ThreadLocal是的确是相对于每个线程,每个线程会有自己的ThreadLocal。但是上面已经讲到,一
般的应用服务器都会维护一套线程池。因此,不同用户访问,可能会接受到同样的线程。因此,在做基于TheadLocal时,需要谨慎,避免出现
ThreadLocal变量的缓存,导致其他线程访问到本线程变量

四、对每个用户访问,ThreadLocal可以多用
       
可以说,ThreadLocal是一把双刃剑,用得来的话可以起到非常好的效果。但是,ThreadLocal如果用得不好,就会跟全局变量一样。代码不
能重用,不能独立测试。因为,一些本来可以重用的类,现在依赖于ThreadLocal变量。如果在其他没有ThreadLocal场合,这些类就变得不
可用了。个人觉得ThreadLocal用得很好的几个应用场合,值得参考

1、存放当前session用户:quake
want的jert

2、存放一些context变量,比如webwork的ActionContext

3、存放session,比如Spring
hibernate orm的session

时间: 2024-11-03 22:17:33

ThreadLocal的几种误区的相关文章

探索式测试中的几种误区

探索式测试(Exploratory Testing)是敏捷测试中的重要组成部分,其价值与一般性测试如用户故事测试或者自动化测试不同,它所关注的是“意料之外”的软件缺陷,探索式测试作 为一个研究性.启发性和严肃性并存的测试方法,是一般性测试的重要补充.随着敏捷测试的推广,探索式测试逐渐受到大家的关注和重视.本文主要探讨了测试工 程师在探索式测试方面的一些误区,并尝试纠正这些问题. 误区1:探索式测试是一种测试技术. 探索式测试本身不是一种测试技术,相反,它是一种可以应用于广泛测试技术的方式或态度.

设计中常见的11种误区

设计师们经常会创作一些不合时宜的作品,他们将设计与艺术混为一谈,持有幸运.灵感和个人表达的想法.让我们一起来细数一些常见的设计误区. 理解这些误区 设计并不复杂,就是制作产品.由于设计师的设计内容十分广泛,从物品.信息设计,到动作.构图设计,等等,这使得很难对设计进行明确的定义.毫无疑问,关于设计存在许多不同的判断.理念与误区,且在高效地产出作品方面存在一些分歧.这些误解会阻碍我们创作出好的设计. 需要证据证实误区存在吗?看看设计师们放在公文包里的设计作品吧!纵使外观美丽养眼,设计本身却残破不堪

Java多线程10:ThreadLocal的作用及使用

ThreadLocal的作用 从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的,通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象,其他线程不需要去访问,也是访问不到的.各个线程中的ThreadLocal.ThreadLocalMap以及ThreadLocal.ThreadLocal中的值都是不同的对象. 至于为什么要使用ThreadLoca

传统企业在自建App时候可能会遇到的误区

越来越多的传统企业为了顺应时代潮流,纷纷推出自己的移动应用产品.但有许多传统企业在做APP的时候往往因思维的束缚而陷入了一些误区.今天APICloud就举出几个企业在策划移动应用产品或执行阶段中过程中常有的误区,希望能让企业在构建移动产品时,少走一些弯路. 误区一:工业思维的延续 国内的传统企业都拥有少则十几年,多则数十甚至数百年的发展史.在这其中每个企业都拥有对行业独到的理解和一整套行为思考准则,这虽然可以让企业立于不败之地,但也很容易导致思维僵化的延续.企业可能会抱有这样的幻想:利用其在行业

ThreadLocal的作用及使用

http://www.cnblogs.com/xrq730/p/4854820.html ThreadLocal的作用 从上一篇对于ThreadLocal的分析来看,可以得出结论:ThreadLocal不是用来解决共享对象的多线程访问问题的, 通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象,其他线程 不需要去访问,也是访问不到的.各个线程中的ThreadLocal.ThreadLocalMap以及Thread

jdk自带的ThreadLocal和netty扩展的FastThreadLocal比较总结

最近在分析一潜在内存泄露问题的时候,jmap出来中有很多的FastThreadLocalThread实例,看了下javadoc,如下: A special variant of ThreadLocal that yields higher access performance when accessed from a FastThreadLocalThread. Internally, a FastThreadLocal uses a constant index in an array, in

如何避开PPT演讲的几个误区(下)

误区5: 装饰工程 ── 为显专业而坚决避开"项目符号"(Bullet Points) 所有关于PPT设计制作的书籍和著作都会反对滥用"项目符号",有一本算一本.Cliff Atkinson把这种想法大张旗鼓地做了自己的书名:"Beyond Bullet Points"(简体中文版:<PPT演绎──故事化设计>). 于是,在职场实际应用中,有人坚决避开"项目符号",并视之为猛虎野兽,很怕自己使用了"项目符

分析师为Twitter叫屈:拿它和FB攀比是误区

据国外媒体报道,Twitter首席执行官科斯特罗近日在外界压力下宣布将辞职,Twitter被认为其业绩表现和曾经的对手Facebook相比,差距越来越大.不过日前美国一名行业人士表示,Twitter和Facebook有着明显的不同,要求Twitter具备Facebook一样的高增长和好业绩,是一种误区. 美国天使投资人和inside.com网站的首席执行官乔森·卡拉卡尼斯(JasonCalacanis)日前在接受美国财经媒体CNBC采访时作出这番表态. 他表示,许多人将Twitter的业绩和Fa

APIcloud 传统企业在自建App时候可能会遇到的误区

越来越多的传统企业为了顺应时代潮流,纷纷推出自己的移动应用产品.但有许多传统企业在做APP的时候往往因思维的束缚而陷入了一些误区.今天APICloud就举出几个企业在策划移动应用产品或执行阶段中过程中常有的误区,希望能让企业在构建移动产品时,少走一些弯路. 误区一:工业思维的延续 国内的传统企业都拥有少则十几年,多则数十甚至数百年的发展史.在这其中每个企业都拥有对行业独到的理解和一整套行为思考准则,这虽然可以让企业立于不败之地,但也很容易导致思维僵化的延续.企业可能会抱有这样的幻想:利用其在行业