首页 > 其他 > 详细

ThreadLocal土话解说

时间:2019-07-25 22:02:25      阅读:127      评论:0      收藏:0      [点我收藏+]

前言

 废话不多说,先了解什么是threadLocal,下面是threadLocal类的说明注释,

技术分享图片

这段话大致(猜的)意思是,改类为线程提供了一个局部变量,但是呢,这个变量和普通的变量又有所不同,怎么不同呢,那就是这个类提供的线程的变量只能被该线程访问,别的线程访问不了,也就是说,这个局部变量是该线程私有的,不与别人分享的。那么问题来了:

  1. 线程为什么要一个这么个私有的别人不能访问的变量呢,存在即合理,他存在的意义是什么呢
  2. 这个变量又是怎么保存的呢

存在即合理

       是不是我们再开发中有时候有这种需求,我们在一个线程中,需要一个类似于一个会话级别session级别的缓存的额东西,我们把一些变量信息保存进去,然后再这个线程里随取随用,但是又不会干扰其他线程的变量,可能一些老司机脑海里已经出现一个词,对,线程的上下文,类似于一个线程级别的上下文,随着线程的销毁而销毁。那么恭喜你,threadLocal可以完美的解决的您的问题,只要您定义好您的threadLocal对象,并且随时可以拿到这个对象(譬如,定义成某个类的静态变量),然后实现了在线程里面一次set,到处get了,是不是很清爽呀。可能这时候有同学就会举手了,我可以把我的变量设置在父线程里面或干脆设置为静态常量,然后岂不是更清爽吗,如果这么想的话是没错,但是前提是,你要保证你的变量是线程安全的哦,也是没有实现线程安全,我的个乖乖,多个线程访问一个对象,其结果我就不用说了吧。对的,我们的threadLocal可以让你享受清爽的同时,还能保证你的线程安全(千万不要吧父变量放到threadLocal里面,不,应该说是放到本线程里面,下面会说这个问题的)。

  小结:threadLocal可以让我们清爽的写代码使用变量同时,还能贴心的为我们解决线程安全的问题。

变量是怎么保存到threadLocal里面呢

  可能已经又同学开始喷我了呢,threadLocal里面并没有保存对象实例,怎么能说保存到threadLocal里面呢?老司机,喷的对,标题就是误导人的,我们的对象实例真正是保存再我们当前线程的一个变量里面的呢。代码为证

 public void set(T value) {
     //获取当前线程实例 Thread t
= Thread.currentThread();
     //获取一个threadLocalMap对象  ThreadLocalMap map
= getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }

这是我们的ThreadLocal类的set方法,大家看方法名应该也才出来这个方法是干啥的吧,yes,我们就是通过这个方法把我们想要保存到线程的实例保存进去的。具体实现我们看到,首先调用了一个获取当前线程实例的方法,接着呢又拿着当前线程的实例获取了一个叫ThreadLocalMap的对象,然后判断把我们的实例set到了这个map里面了。

问题来了,这个map是什么鬼,哪里来的呢

  想要知道这个map哪里来的,我们只需把getMap(t)这个方法扒出来,是不是就一目了然呢。扒出来看一下:

 ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

代码如此简单,返回线程参数的一个变量。但是简单的代码却告诉了我们两个信息

  1. 当前线程对象实例有个ThreadLocalMap变量(废话)
  2. 我们获取的map对象原来是当前线程实例的一个变量(也是废话)
  3. 原来我们调用set方法时候,是把我们要保存的实例放到了当前线程实例的一个threadLocalMap变量里面(划重点)

但是:

问题又来了,这个ThreadLocalMap又是个什么鬼

未完待续

 

ThreadLocal土话解说

原文:https://www.cnblogs.com/dazhaung/p/11231570.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!