java实现线程局部变量:ThreadLocal
2010-12-05 16:34
190 查看
需求:在多线程中最需要关心的就是数据的同步问题,防止数据因为多线程的访问而照成混乱
这个问题解决方案:比如将数据访问和处理过程加上同步锁synchronized,使线程排队当一个线程处理完后再重新竞争来处理,或者让线程等待wait(),再唤醒。
这样做当然可以,但每次一个线程拿到的数据都是上个线程处理完后的结果,那么如果我想要这个数据为本线程独有的,不会受到其他线程的影响呢?此时肯能你会觉得这很简单嘛,只要只要多线程之间不共享这个对象不就行了吗?但如果我们却又希望这个变量在这个该线程中是全局的。
问题:要做到线程全局的,那么就是static,但这样其他线程也就共享了,这就不能做到每个线程独享了,这是个矛盾的问题,那么如何做到线程内共享呢?这就是线程局部变量的概念了。
这个时候ThreadLocal就派上用场了。
使用:
1.定义一个线程局部变量。
private static ThreadLocal<Person> myPerson = new ThreadLocal<Person>() {
public Person initialValue() {
return null;
}
};
此处的Person为自定义类型,初始化设置为null,这样就定义了一个类型为Person的线程局部变量myPerson。
2.使用线程局部变量。
对线程局部变量操作时,通过ClassName.myPerson.get()这样返回得到了该线程的局部变量myPerson了,在该线程中这个应用时共享的,在当前线程外是隔离的不可见的。
这个问题解决方案:比如将数据访问和处理过程加上同步锁synchronized,使线程排队当一个线程处理完后再重新竞争来处理,或者让线程等待wait(),再唤醒。
这样做当然可以,但每次一个线程拿到的数据都是上个线程处理完后的结果,那么如果我想要这个数据为本线程独有的,不会受到其他线程的影响呢?此时肯能你会觉得这很简单嘛,只要只要多线程之间不共享这个对象不就行了吗?但如果我们却又希望这个变量在这个该线程中是全局的。
问题:要做到线程全局的,那么就是static,但这样其他线程也就共享了,这就不能做到每个线程独享了,这是个矛盾的问题,那么如何做到线程内共享呢?这就是线程局部变量的概念了。
这个时候ThreadLocal就派上用场了。
使用:
1.定义一个线程局部变量。
private static ThreadLocal<Person> myPerson = new ThreadLocal<Person>() {
public Person initialValue() {
return null;
}
};
此处的Person为自定义类型,初始化设置为null,这样就定义了一个类型为Person的线程局部变量myPerson。
2.使用线程局部变量。
对线程局部变量操作时,通过ClassName.myPerson.get()这样返回得到了该线程的局部变量myPerson了,在该线程中这个应用时共享的,在当前线程外是隔离的不可见的。
相关文章推荐
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景(面试题)
- Java中的线程同步与ThreadLocal无锁化线程封闭实现
- java 使用动态代理 和ThreadLocal实现事务管理实例
- java并发(3)ThreadLocal的使用及实现原理(实现原理)
- java并发(2)ThreadLocal的使用及实现原理(使用)
- java-线程-用ThreadLocal类实现线程范围内的数据共享
- Java多线程探究-线程局部变量ThreadLocal
- java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
- POJO中使用ThreadLocal实现Java嵌套事务
- java多线程学习之通过ThreadLocal实现每个线程拥有自己的变量
- java线程:单例隐藏ThreadLocal实现线程数据共享
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
- java concurrency: ThreadLocal及其实现机制
- java Thread之ThreadLocal(线程局部变量)
- 浅析Java中通过ThreadLocal实现线程绑定来传递参数
- 【java】动态代理+ThreadLocal实现数据源及事务管理
- 通过ThreadLocal和HandlerInterceptor实现java后台业务埋点日志功能
- 【java基础】ThreadLocal的实现原理
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
- Java中ThreadLocal类的作用以及实现原理-----hibernate的连接池就是用ThreadLocal实现的