ThreadLocal本地线程变量的了解ITeye - 超凡娱乐

ThreadLocal本地线程变量的了解ITeye

2019年04月01日12时47分34秒 | 作者: 泽洋 | 标签: 线程,变量,一个 | 浏览: 1505

       一般的Web使用划分为展示层、效劳层和耐久层三个层次,在不同的层中编写对应的逻辑,基层经过接口向上层敞开功用调用。在一般情况下,从接纳恳求到回来呼应所经过的一切程序调用都同归于一个线程。

       也便是说,同一线程贯穿N层,不同的线程或许由于参数等不同会对程序中的某些变量进行修正,可是又要防止修正后的值对其它线程产生影响,由于不同的线程能够一起运转滴,这就需求咱们处理对某些线程同享的变量的拜访抵触问题。ThreadLocal本地线程变量便是一种处理办法,它经过将程序中不安全的变量封装进ThreadLocal中,这相当于为每一个线程供给一个独立的变量副本(其实是不同的目标),线程修正变量的值对其它线程来说没影响了,由于其它线程有自己的一个副本信息。



 

代码了解:

 

 

// 凭借ThreadLocal目标每个线程只创立一个实例
public static final String dateFormat="yyyy-MM-dd";
private static final ThreadLocal DateFormat dfThreadLocal=new ThreadLocal DateFormat (){
 @Override
 protected DateFormat initialValue() {
 return new SimpleDateFormat(dateFormat);
public static String dateToString(Date date){
 return dfThreadLocal.get().format(date);
}

 

 

       关于每个线程,都有一个类似于Map的东西ThreadLocalMap(ThreadLocal的静态类 ),那它里边保存了什么东东呢,必定是key-value啊,key便是上面代码中的同享静态变量 dfThreadLocal,value便是DateFormat实例了,即new SimpleDateFormat(dateFormat)这个东东。那接下来,在线程内我要怎么去获取这个值呢,便是靠dfThreadLocal.get()完成滴,办法源码如下:

 

 

ThreadLocal .ThreadLocalMap inheritableThreadLocals = null ;
public T get () {
 Thread t = Thread.currentThread ();
 // 获取到inheritableThreadLocals
 ThreadLocalMap map = getMap(t );
 if ( map != null) {
 // this作为key,this便是本地线程变量,获取Entry
 ThreadLocalMap.Entry e = map.getEntry (this);
 if ( e != null)
 return ( T)e .value;
 return setInitialValue ();
ThreadLocalMap getMap (Thread t) {
 return t .inheritableThreadLocals;
}

 

 

 

       能够很明显的看出,首要依据Thread.currentThread ()获取到inheritableThreadLocals(即ThreadLocalMap,他是Thread的一个变量),然后将this(即最上面代码的dfThreadLocal目标)作为key(或索引)获取到真实的值T(便是SimpleDateFormat目标)啊,至此应该比较清楚了,为什么不同的线程有各自的值,由于 不同的线程- 不同的ThreadLocalMap目标(线程的变量)- 经过相同的key(如果有被static润饰)获取到不同的value值。

       补白:一般都被static润饰,由于能够防止在一个线程内或许发生的重复创立TSO(Thread Specific Object,即ThreadLocal所相关的目标),被statis润饰了,同一线程key也必定相同,value也必定只要一份了。

       一个ThreadLocal实例相关当时线程的一个TSO目标,如果把ThreadLocal声明为实例变量,那么每创立一个类实例就会导致一个TSO实例诞生,这必定没有这个必要滴。

 

更多文章请见我的个人博客:http://www.acanblog.com

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章