需求:在多线程中最需要关心的就是数据的同步问题,防止数据因为多线程的访问而照成混乱
这个问题解决方案:比如将数据访问和处理过程加上同步锁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了,在该线程中这个应用时共享的,在当前线程外是隔离的不可见的。