论坛首页 Java企业应用论坛

ThreadLocal示例

浏览 16627 次
精华帖 (2) :: 良好帖 (13) :: 新手帖 (13) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-14  
pengjunwu 写道
分离的北极熊 写道
ThreadLocal 以空间换时间
Synchornized 以时间换空间

ThreadLocal 同一个线程下确保获取的对象是唯一的,对其修改不会影响到其他线程。
其中initialValue()是一个空方法

疑问:
private static ThreadLocal<SimpleDateFormat> threadlocal = new ThreadLocal<SimpleDateFormat>(){
  protected synchronized Object initialValue(){
      reutrn new SimpleDateFormat(format);
  }
};
每个ThreadLocal在多线程下也能确保拿到的对象和其他线程不相同
而上面也提到了ThreadLocal是空间换时间,但是里面覆盖的initialValue() 却又加上了synchornized字段,这是不是有点相互矛盾?

疑问的地方在这,望解答。




加这个synchornized 就是由于SimpleDateFormat 是非线程安全 所以要同步
例如 线程a threadlocal.get()方法是这样执行 先获取当前的thread a 然后通过thread a来获取当前线程的 ThreadLocalMap(每个线程都有各自的ThreadLocalMap) 然后以threadlocal为key来get value 由于第一次获取的ThreadLocalMap 是null 此时会调用initialValue方法来new SimpleDateFormat(format) 。注意此时需要同步控制 (因为可能线程b此时也可能做new SimpleDateFormat(format)这个动作 线程a与线程b是同一个同步锁threadlocal )
注意各个线程用的key都是同一个threadlocal (threadlocal 是static 各个线程是能共享访问的)

其实这样只是保证了在线程a 的整个执行过程中 能获取到同一个SimpleDateFormat对象实例 如果有1000个线程 还是创建了1000个 SimpleDateFormat对象实例 
总结使用threadlocal只是为了避免了将这个对象作为参数传递的麻烦


既然是2个线程,而ThreadLocal是保证同一线程下获取的对象唯一,2个线程要拿到同一个对象?你看它的普通写法,也没有涉及任何同步,这就和第一个例子矛盾了

比如我现在管理Connection ,2个线程,我同事拿这一个连接,那不死的很惨。
0 请登录后投票
   发表时间:2011-03-12  
其实楼主贴出来的使用ThreadLocal的解决方案,依然没有解决SimpleDateFormat创建开销昂贵的问题。

因为ThreadLocal的作用是:使得同一个线程共享一个实例,不同线程使用各自的实例。

对于多线程的情况,依然会创建很多个SimpleDateFormat实例。
0 请登录后投票
   发表时间:2011-03-12  
Jony.Hwong 写道
其实楼主贴出来的使用ThreadLocal的解决方案,依然没有解决SimpleDateFormat创建开销昂贵的问题。

因为ThreadLocal的作用是:使得同一个线程共享一个实例,不同线程使用各自的实例。

对于多线程的情况,依然会创建很多个SimpleDateFormat实例。


用ThreadLocal,n个线程创建n个SimpleDateFormat,不用ThreadLocal。n个线程创建kn个SimpleDateFormat
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics