threadlocal

来源:互联网 发布:win7公用网络无法修改 编辑:程序博客网 时间:2024/06/05 19:30
 
1.threadlocal使得在同一线程中共享某个资源;
2.并在不同线程间对该资源的访问彼此独立,互不影响。 

比起第二个功能,第一个功能才是重点。


线程局部变量,人如其名,在线程这个作用域内有效,在同一线程中共享该变量。


threadlocal最典型的案例是在spring中,同一个事务多个dao共享一个connection。同一个事务在同一个线程中。




在博文——ThreadLocal封装Connection,实现同一线程共享资源中,有些论述也可支持我的观点。
博文链接:http://blog.csdn.net/jiuqiyuliang/article/details/38417623

以下是一些抄述:
对比ThreadLocal和synchronized同步机制


相同点:
        1、ThreadLocal和线程同步机制都能解决多线程中相同变量的访问冲突问题。
不同点:
       1、适用的情况不同
 
        在同步机制中,使用同步保证同一时间只有一个线程访问,不能同时访问共享资源,否则就是出现错误。同步机制对共享数据的修改会影响到对方。ThreadLocal则隔离了相关的资源,并在同一个线程中可以共享这个资源。彼此独立,修改不会影响到对方
 
       2、最终实现的效果不同
    
       对于多线程资源共享问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。


       ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量),这样当然不需要对多个线程进行同步了。所以,如果你需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal,这将极大地简化你的程序,使程序更加易读、简洁。


简单的说,同步机制是为了通信,而threadlocal是为了隔离数据共享。


对thresdlocal的第二个功能的理解是这样的:
    每个线程只是单独改变它的变量副本,该副本随着线程的结束而消失。所以使用threadlocal并不能改变线程外的原始变量的值。
这也是线程局部变量的另一个特点。变量副本相当于线程这个作用域内的形参,而原始变量相当于线程外的实参。形参值的改变不会影响到实参。 



要正确使用ThreadLocal,必须注意以下几点:
转载注明出处:http://x- spirit.javaeye.com/、http: //www.blogjava.net/zhangwei217245/ 
1.总是对ThreadLocal中的initialValue()方法进行覆盖
转载注明出处:http://x- spirit.javaeye.com/、http: //www.blogjava.net/zhangwei217245/ 
2. 当使用set()或get()方法时牢记这两个方法是对当前活动线程中的ThreadLocalMap进行操作,一定要认清哪个是当前活动线程!
转载注明出处:http://x- spirit.javaeye.com/、http: //www.blogjava.net/zhangwei217245/ 
3. 适当的使用泛型,可以减少不必要的类型转换以及可能由此产生的问题。


为什么要对initialValue()方法进行覆盖呢?详细情况可以阅读链接:http://www.blogjava.net/zhangwei217245/archive/2010/04/24/317651.html

转载注明出处:http://x- spirit.javaeye.com/、http: //www.blogjava.n






0 0
原创粉丝点击