当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

JAVA中的ThreadLocal

发表于: 2014-09-16   作者:第一次认识梦想   来源:转载   浏览次数:
摘要: 今天听一位大神提到线程安全与ThreadLocal,由于对ThreadLocal不太了解,就上网搜了一下,看到了很多人的文章,写得很复杂,众说纷纭,于是自己去看了下Oracle的文档,关于ThreadLocal有下面一段话。 This class provides thread-local variables. These variables differ from their normal
今天听一位大神提到线程安全与ThreadLocal,由于对ThreadLocal不太了解,就上网搜了一下,看到了很多人的文章,写得很复杂,众说纷纭,于是自己去看了下Oracle的文档,关于ThreadLocal有下面一段话。

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).

翻译:这个类提供[本地线程]的变量。这些变量每个都有不同的副本,各个线程访问某一个变量的时候(通过set或get方法),都与得到一个它(当前线程)自己的,单独初始化的变量副本。ThreadLocal实例的典型用法是作为一个私有静态(private static)变量,与一个线程的状态相关联。(如用户ID,事务ID等等)


我想这个问题远没有那么复杂,其实可以简单的理解成,当有一个类A的实例a(注意这个实例不是ThreadLocal实例)需要被多线程访问的时候,如果想根据不同的Thread有不同的标识或者状态的话,那么就需要一个这样的变量(ThreadLocal实例,实例a的私有静态变量),来保存所有Thread的标识(用ThreadLocalMap来保存,key的个数就是当前活动的访问该实例a的线程数)。

为什么用ThreadLocal?
这个每个Thread不同的标识可能是根据Thread计算得来的,也可能是从数据库得来的值,所以每次用的时候都去取是不现实的,所以需要保存起来,等下次用到的时候直接拿来用。

Oracle的官方文档写得很明白,而且也有例子,这个类跟线程同步完全没有任何概念上的类似,完完全全两个问题,因为它不需要同步,它保存的正是每个线程不同之处。

Oracle文档出处:http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html

JAVA中的ThreadLocal

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
源地址:http://www.it.com.cn/f/edu/053/25/91753.htm 早在Java 1.2推出之时,Java平台中就引入了
这一篇之所以讲ThreadLocal,是因为之前在读Handler,Looper的源码过程(见http://maosidiaoxian.itey
上篇讲到了ThreadLocal类(http://maosidiaoxian.iteye.com/blog/1939142),这篇继续讲ThreadLocal
概述 我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线
设计相关 ThreadLocal模式 1,ThreadLocal 不是用来解决共享对象的多线程访问问题的,ThreadLocal和多
ThreadLocal通过中文解释就是线程本地变量,是线程的一个局部变量。根据哲学家黑格尔“的存在即合理
ThreadLocal如果单纯从名字上来看像是“本地线程"这么个意思,只能说这个名字起的确实不太好,很容
测试代码如下: 需要注意执行到构造函数和run方法当前的线程ID。以及在何时给ThreadLocal变量塞值。
我在之前的文章《Android中的Looper,Handler及HandlerThread简析》(http://maosidiaoxian.iteye.co
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号