对于Java ThreadLocal的理解与应用场景分析

一、对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的这种特征变量,会针对不同的线程,有不同的值。

参考博客:http://www.iteye.com/topic/103804

ThreadLocal的理解与应用场景分析的更多相关文章

  1. ThreadLocal深入理解与内存泄露分析

    ThreadLocal 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本.所以每个线程都能够独立地改变自己的副本.而不会影响其他线程所相应的副本. ...

  2. ThreadLocal 原理和使用场景分析

    ThreadLocal 不知道大家有没有用过,但至少听说过,今天主要记录一下 ThreadLocal 的原理和使用场景. 使用场景 直接定位到 ThreadLocal 的源码,可以看到源码注释中有很清 ...

  3. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  4. 理解 python metaclass使用技巧与应用场景分析

    理解python metaclass使用技巧与应用场景分析       参考: decorator与metaclass:http://jfine-python-classes.readthedocs. ...

  5. ThreadLocal深入理解一

    转载:http://www.cnblogs.com/dolphin0520/p/3920407.html 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使 ...

  6. ThreadLocal的实现和使用场景

    ThreadLocal 内部实现.应用场景和内存泄漏 深入理解线程局部变量:ThreadLocal <Java源码分析>:ThreadLocal /ThreadLocalMap Threa ...

  7. Java中的ThreadLocal深入理解

    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...

  8. 并发编程学习笔记(8)----ThreadLocal的使用及源码分析

    1. ThreadLocal的理解 ThreadLocal,顾名思义,就是线程的本地变量,ThreadLocal会为每个线程创建一个本地变量副本,使得使用ThreadLocal管理的变量在多线程的环境 ...

  9. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

随机推荐

  1. 再起航,我的学习笔记之JavaScript设计模式16(享元模式)

    ### 享元模式 **享元模式(Flyweight):** 运用共享技术有效地支持大量的细粒度的对象,避免对象间拥有相同内容造成多余的开销. 上回我们在组合模式中创建了文章列表类,这次我们要向不同的文 ...

  2. POI实现excel各种验证和导入的思路总结

      制定标准 导入总是与导出相辅相成的,无规矩不成方圆.所谓的标准都是大家一同来维护和遵守的,那么首先就是制定一个模板. 这样可以减少验证的工作量. 例如时间的规范[yyyy-MM-dd],获取单元格 ...

  3. 如何用比较快速的方法掌握Spring的核心——依赖注入,Java web轻量级开发面试教程 读书笔记

    我们知道,Java方面的高级程序员一定得掌握Spring的技能,其中包括Spring 依赖注入(IOC),面向切面(AOP),和数据库的整合(比如和Hibernate整合或声明式事务等)以及Sprin ...

  4. C# 反向生成工具(DAL BLL Modle)

    VS2015  ADO.NET无果后果断~! 动软生成:http://pan.baidu.com/s/1gfIf0ZL

  5. AmpLab Tachyon and Shark update

    一个开源的文件系统,拿来主义,先收藏,用得到细品. 简介:https://www.youtube.com/watch?v=cAZ624-69PQ 官网:http://tachyon-project.o ...

  6. Vue项目搭建基础之Vue-cli模版测试

    第一步安装node,nodejs.org下载node稳定版安装包.node -v   (查看node版本)npm install -g vue-cli(安装Vue脚手架环境)vuevue listvu ...

  7. 团队作业10--Beta阶段项目复审

    小组的名字和链接 优点 缺点 最终排名 油炸咸鱼 http://www.cnblogs.com/24app/ 基本功能实现,能够完成预期达到的大部分功能,并能够修复所有自己提出的bug,界面也还行,博 ...

  8. Swing-JTable检测单元格数据变更事件

    在JTable的初级教程中往往会提到,使用TableModel的 addTableModelListener方法可以监听单元格数据的变更,在其事件处理函,数tableChanged中,可以通过e.ge ...

  9. 201521123072《java程序设计》第十一周学习总结

    201521123072<java程序设计>第十一周学习总结 1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问 ...

  10. 201521123017 《Java程序设计》第10周学习总结

    1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 1.1 截图 1.2 4-2中fin ...