锁定老帖子 主题:ThreadLocal示例
精华帖 (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个线程,我同事拿这一个连接,那不死的很惨。 |
|
返回顶楼 | |
发表时间:2011-03-12
其实楼主贴出来的使用ThreadLocal的解决方案,依然没有解决SimpleDateFormat创建开销昂贵的问题。
因为ThreadLocal的作用是:使得同一个线程共享一个实例,不同线程使用各自的实例。 对于多线程的情况,依然会创建很多个SimpleDateFormat实例。 |
|
返回顶楼 | |
发表时间:2011-03-12
Jony.Hwong 写道 其实楼主贴出来的使用ThreadLocal的解决方案,依然没有解决SimpleDateFormat创建开销昂贵的问题。
因为ThreadLocal的作用是:使得同一个线程共享一个实例,不同线程使用各自的实例。 对于多线程的情况,依然会创建很多个SimpleDateFormat实例。 用ThreadLocal,n个线程创建n个SimpleDateFormat,不用ThreadLocal。n个线程创建kn个SimpleDateFormat |
|
返回顶楼 | |