`
第一次认识梦想
  • 浏览: 2349 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA中的ThreadLocal

    博客分类:
  • java
阅读更多
今天听一位大神提到线程安全与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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics