java实现线程局部变量:ThreadLocal

来源:互联网 发布:农村淘宝如何选址 编辑:程序博客网 时间:2024/05/17 17:59

需求:在多线程中最需要关心的就是数据的同步问题,防止数据因为多线程的访问而照成混乱

这个问题解决方案:比如将数据访问和处理过程加上同步锁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了,在该线程中这个应用时共享的,在当前线程外是隔离的不可见的。

原创粉丝点击