threadlocal
来源:互联网 发布:win7公用网络无法修改 编辑:程序博客网 时间:2024/06/05 19:30
1.threadlocal使得在同一线程中共享某个资源;
2.并在不同线程间对该资源的访问彼此独立,互不影响。
2.并在不同线程间对该资源的访问彼此独立,互不影响。
比起第二个功能,第一个功能才是重点。
线程局部变量,人如其名,在线程这个作用域内有效,在同一线程中共享该变量。
threadlocal最典型的案例是在spring中,同一个事务多个dao共享一个connection。同一个事务在同一个线程中。
在博文——ThreadLocal封装Connection,实现同一线程共享资源中,有些论述也可支持我的观点。
博文链接:http://blog.csdn.net/jiuqiyuliang/article/details/38417623
以下是一些抄述:
对比ThreadLocal和synchronized同步机制
相同点:
1、ThreadLocal和线程同步机制都能解决多线程中相同变量的访问冲突问题。
不同点:
1、适用的情况不同
在同步机制中,使用同步保证同一时间只有一个线程访问,不能同时访问共享资源,否则就是出现错误。同步机制对共享数据的修改会影响到对方。ThreadLocal则隔离了相关的资源,并在同一个线程中可以共享这个资源。彼此独立,修改不会影响到对方。
2、最终实现的效果不同
对于多线程资源共享问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
相同点:
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. 适当的使用泛型,可以减少不必要的类型转换以及可能由此产生的问题。
转载注明出处: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
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- ThreadLocal
- threadlocal
- ThreadLocal
- ThreadLocal
- javascript 中的arguments.callee
- Javascript—XPATH技术解析XML
- 校园网&openwrt记(二)应用的大体设计
- 无线传感器网络覆盖盲区的发现与修复方法研究
- 将EXCEL自定义时间格式转换为时间格式
- threadlocal
- Bitmap对象在内存中的大小和转化为字节流的大小
- 多线程互斥
- [JAVA · 初级]:1.环境变量的配置
- LeetCode:Add Two Numbers
- make命令
- handler 复习
- 作用域学习--------this
- 大数据最佳实践指南05---ADMA