https://blog.csdn.net/u012706811/article/details/53231598       这篇文章也很赞,值得研究

一、对ThreadLocal理解

ThreadLocal提供一个方便的方式,可以根据不同的线程存放一些不同的特征属性,可以方便的在线程中进行存取。

二、以session为例来理解ThreadLocal

  在web开发的session中,不同的线程对应不同的session,那么如何针对不同的线程获取对应的session呢?

  我们可以设想了如下两种方式:

  1.在action中创建session,然后传递给Service,Service再传递给Dao,很明显,这种方式将使代码变得臃肿复杂。

  2.创建一个静态的map,键对应我们的线程,值对应session,当我们想获取session时,只需要获取map,然后根据当前的线程就可以获取对应的值。

  我们看看Hibernate中是如何实现这种情况的:

   

  在Hibernate中是通过使用ThreadLocal来实现的。在getSession方法中,如果ThreadLocal存在session,则返回session,否则创建一个session放入ThreadLocal中。

  总结一下就是在ThreadLocal中存放了一个session。

为什么我们在ThreadLocal存放一个session,这个session就会与一个线程对应呢?

  实际上ThreadLocal中并没有存放任何的对象或引用,在上面的的代码中ThreadLocal的实例threadSession只相当于一个标记的作用。而存放对象的真正位置是正在运行的Thread线程对象,每个Thread对象中都存放着一个ThreadLocalMap类型threadLocals对象,这是一个映射表map,这个map的键是一个ThreadLocal对象,值就是我们想存的局部对象。

  我们以上面的代码为例分析一下:

  当我们往ThreadLocal中存放变量的时候发生了什么?

  即这行代码时。

  

我们看下ThreadLocal的源码中set()方法的实现。

如果把这些代码简化的话就一句

  Thread.currentThread().threadLocals.set(this,value);

  Thread.currentThread()获取当前的线程

  threadLocals就是我们上面说的每个线程对象中用于存放局部对象的map

  所以set()就是获取到当前线程的map然后把值放进去,我们发现键是this,也就是当前的ThreadLocal对象,可以发现ThreadLocal对象就是一个标记的作用,我们根据这个标记找到对应的局部对象。

  如果对比get()方法,可以发现原理都差不多,都是对线程中的threadLocals这个map的操作,我就不解释了。

  ThreadLocal就是一个标记的作用,当我们在线程中使用ThreadLocal的set()或者get()方法时,其实是在操作我们线程自带的threadLocals这个map,多个线程的时候自然就有多个map,这些map互相独立,但是,这些map都是根据一个ThreadLocal对象(因为它是静态的)来作为键存放。

  这样可以在多个线程中,每个线程存放不一样的变量,我们通过一个ThreadLocal对象,在不同的线程(通过Thread.currentThread()获取当前线程)中得到不同的值(不同线程的threadLocals不一样)。

  为什么threadLocals要是一个map呢?

  因为我们可能会在一个类中声明多个ThreadLocal的实例,这样就有多个标记,所以要使用map对应。

总结:

  ThreadLocal就是用来在类中声明的一个标记,然后通过这个标记就根据不同Thread对象存取值。

应用场景:

  在线程中存放一些就像session的这种特征变量,会针对不同的线程,有不同的值。

Java ThreadLocal study 2相关推荐

  1. Java ThreadLocal 使用详解

    ThreadLocal的官方API解释为: "该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每 ...

  2. Java ThreadLocal的使用

    Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量.因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread ...

  3. Java ThreadLocal

    ** 一:ThreadLocal的简要介绍及使用 ** Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量.因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个 ...

  4. java threadlocal 缺点_Java的ThreadLocal如何在后台实现?

    小编典典 这里的所有答案都是正确的,但是有些令人失望,因为它们多少掩盖了聪明ThreadLocal的实现是多么的明智.我只是在寻找源代码,ThreadLocal并且对它的实现方式印象深刻. 天真的实现 ...

  5. java threadlocal用法_Java ThreadLocal的用法解析

    简介 java中经常使用ThreadLocal作为处理高并发访问的可选手段,ThreadLocal并不是一个线程,而是"以线程为作用域"的一种面向对象的数据结构.其用法的也有着让人 ...

  6. java: ThreadLocal简介

    ThreadLocal中有map会存储每个线程的信息,这样,每个线程相当于拥有了局部变量. package com.baobaotao;class Ticket{public int count = ...

  7. java ThreadLocal理解和使用

    一.ThreadLoal的理解 ThreadLoal 变量,它的基本原理是,同一个 ThreadLocal 所包含的对象(对ThreadLocal< String >而言即为 String ...

  8. java threadlocal 并发_Java并发编程:ThreadLocal

    一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多.可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个 ...

  9. java ThreadLocal用法及原理

    w未完待续 转载于:https://www.cnblogs.com/flying1025/p/6278735.html

  10. Java并发编程之ThreadLocal源码分析

    1 一句话概括ThreadLocal   什么是ThreadLocal?顾名思义:线程本地变量,它为每个使用该对象的线程创建了一个独立的变量副本. 2 ThreadLocal使用场景   用一句话总结 ...

最新文章

  1. 求自定类型元素序列的中位数
  2. arduinows2812灯条程序_Arduino 控制WS2812 LED灯条
  3. 理解JS中的this的指向
  4. Python教程:多维列表(元组)碾成一维形式
  5. Mol Cell Proteomics. |胡丹丹| 雷公藤红素通过SIRT1-FXR 信号通路保护胆汁淤积性肝损伤...
  6. Oracle CheckPoint进程
  7. mysql concat 引号_在MySQL concat里面使用多个单引号,三引号的问题
  8. 鱼眼镜头的distortion校正【matlab】
  9. 【转】JMeter学习(十三)分布式部署
  10. 微信深色模式最大的槽点终于被干掉了,这一次安卓用户先享受!
  11. 做好准备,让你的短信应用迎接Android 4.4(KitKat)
  12. Parallels Desktop 16 提示“已损坏,无法打开”的解决办法
  13. 高铁:繁忙时限制上车补票
  14. php 开发商城 注意,thinkPHP商城公告功能开发问题分析
  15. 怎么下载小程序图片 ?
  16. 系统自带命令subst.exe创建虚拟软驱
  17. FID指标复现踩坑避坑 文本生成图像FID定量实验全流程复现(Fréchet Inception Distance )定量评价实验踩坑避坑流程
  18. oracle toda和pl/sql匪夷所思的差异
  19. 麻将--国标麻将番种图解 联众麻将规则图解
  20. vue js 进来页面自动播放背景音乐

热门文章

  1. 3D几何图形PS笔刷下载安装
  2. CodeForces1005D - Polycarp and Div 3
  3. 在原生js中的,table表格,display:block之后,样式混乱
  4. 解读戴尔,惠普和思科的“三角关系”
  5. 雅虎想卖个好价钱 竞购方却抱怨它遮遮掩掩
  6. 苹果Mac数据恢复工具:​​​​​​​​Disk Drill Enterprise
  7. Posterino for Mac(图片拼贴编辑器)
  8. 如何解决Mac上安装Axure首次打开报错的问题?
  9. simplemind pro for Mac(思维导图)
  10. 升级Big sur后提示没有权限来打开应用程序(注册机类),该怎么办