背景

JAVA中有全局变量(静态变量,不论在哪个函数 都能访问)、局部变量(函数中定义的变量,在栈中,只能在本函数内访问),主要这2种类型。
threadlocal变量 是一种线程级全局的变量(普通的全局变量是进程级全局),就是在一个线程中,任何函数能访问到这个threadlocal对象关联的对象,只要没有重新设置,都是同一个对象,变量作用域介于全局变量和局部变量之间,
在其他线程中访问这个threadlocal对象,访问不了当前线程设置的关联对象,也就是说一个线程如果没有对threadlocal进行设置,那获取关联对象的时候 肯定是NULL,不管其他线程是否设置过这个threadlocal,
当然如果多个线程设置同一个threadlocal时,被设置的值 是同一个对象,那这些线程访问关联对象时 就是同一个对象了。

本质
threadlocal是一个数据结构和List Map等java数据结构地位是一样的,具体实现是每个“线程对象”中有一个Map,线程存活期中,这个MAP不会被释放,也不会被重置;
线程使用threadlocal时,首先要设置这个threadlocal,设置的时候,以threadlocal这个对象为KEY,以被设置的对象为value,存放到这个线程的MAP中,
后面的代码获取这个threadlocal对象的关联对象时,就以threadlocal对象为KEY 到当前线程的MAP中获取那个先前设置的对象,这样就能在线程中(不同函数中)共享这个被设置的对象了,实现跨函数访问能力。
虽然不同线程设置同一个threadlocal时,KEY是相同的,不过是用不同的MAP,而且访问的时候 也是到不同的MAP中找对象,所以只能访问到本线程设置的对象。

ThreadLocal<User> local = new ThreadLocal<User>();
User u = new User();
void method1()
{
User u1 = new User();
local.set(u1);
}
void method2()
{
local.set(u);
}
void method3()
{
User u = local.get();
}
void test()
{
method1();
method3();
}

void test2()
{
method2();
method3();
}

情景1
thread1执行如下代码
{
test();
}
thread2执行如下代码
{
test();
}

thread1 thread2 执行了相同一段代码,代码中使用了同一个threadLocal
不过他们在线程中设置了不同的关联对象(都是新生成一个对象),后续访问到的关联对象也是不同的

情景2
thread1执行如下代码
{
test2();
}
thread2执行如下代码
{
test2();
}

thread1 thread2 执行了相同一段代码,代码中使用了同一个threadLocal
不过他们在线程中设置了相同的关联对象,后续访问到的关联对象也是相同的

总结:
就是把要共享的对象 设置到线程对象的MAP中,在线程其他函数中 可以访问这个MAP中的对象;设置、获取这个共享对象的过程中用的KEY是threadlocal对象而已

注意: threadlocal 不是为了解决并发访问同一个对象的问题,只是提供跨函数访问同一个对象的能力

用途

跨函数传递参数,特别是在分层架构中,上层的数据需要往下层传递,如果要用函数入参传递,很麻烦,全局变量 又不合适

java threadlocal 背景 本质的更多相关文章

  1. attilax.java 注解的本质and 使用最佳实践(3)O7

    attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 ...

  2. 《Java大学教程》—第24章 Java的背景

    本章主要介绍的是Java的背景知识,通过了解历史知道Java与其他语言的区别,以便更好选择在什么场景下使用Java. 24.2    语言的尺寸Java语言短小.紧凑,以C++为基础,放弃了一些特定的 ...

  3. Java ThreadLocal的使用

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

  4. Java ThreadLocal 源代码分析

    Java ThreadLocal 之前在写SSM项目的时候使用过一个叫PageHelper的插件 可以自动完成分页而不用手动写SQL limit 用起来大概是这样的 最开始的时候觉得很困惑,因为直接使 ...

  5. java threadLocal的初探

    在网上找了半天,终于找到一篇靠谱的文章了. 文章地址:http://qifuguang.me/2015/09/02/[Java%E5%B9%B6%E5%8F%91%E5%8C%85%E5%AD%A6% ...

  6. Java ThreadLocal Example(java中的ThreadLocal例子)

    Java ThreadLocal is used to create thread local variables. We know that all threads of an Object sha ...

  7. 一句话,讲清楚java泛型的本质(非类型擦除)

    背景 昨天,在逛论坛时遇到个这么个问题,上代码: public class GenericTest { //方法一 public static <T extends Comparable< ...

  8. 初识Java ThreadLocal

    转载自:https://www.cnblogs.com/dreamroute/p/5034726.html ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量. 这个玩意有什么用处,或 ...

  9. java ThreadLocal(应用场景及使用方式及原理)

    尽管ThreadLocal与并发问题相关,可是很多程序猿只将它作为一种用于"方便传參"的工具,胖哥觉得这或许并非ThreadLocal设计的目的,它本身是为线程安全和某些特定场景的 ...

随机推荐

  1. JS高级学习笔记(6)- 事件循环

    参考文章:深入理解JS引擎的执行机制        JavaScript 异步.栈.事件循环.任务队列 我的笔记:ES系列之Promise async 和 await Event Loop 前提 js ...

  2. gogs 升级

    可以使用 go get -u github.com/gogs/gogs 来升级,但是因为网络原因,这种升级方式失败了.另外一种是在 github 或者 gitee 上面直接下载源码,然后解压到 $GO ...

  3. EVANYOU尤大个人网站主页CANVAS三角彩带效果分析学习

    尤雨溪网站三角彩带效果 效果: 源码 <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  4. 代码神器:拒绝重复编码,这款IDEA插件了解一下.....

    作者:HeloWxl www.jianshu.com/p/e4192d7c6844 Easycode是idea的一个插件,可以直接对数据的表生成entity.controller.service.da ...

  5. Java多线程之并发包,并发队列

    目录 1 并发包 1.1同步容器类 1.1.1Vector与ArrayList区别 1.1.2HasTable与HasMap 1.1.3 synchronizedMap 1.1.4 Concurren ...

  6. DRF项目之解决浏览器同源策略问题

    DRF项目,是一个前后端分离的Web框架. 本项目中,我们前端采用的是VUE框架. 前后端分离的情况就会出现一个问题,前端的Ajax请求无法请求到后端API(接口). 那么,为什么会出现这种问题呢? ...

  7. web页面内容打印总结

    web页面打印有两种,一种是直接调用window.print()命令操作,一种是使用ActiveX插件(Object标签)操作,但是第二种只支持IE内核的浏览器. 示例1: <!DOCTYPE ...

  8. 传输层上的TCP和UDP

    参考: 知乎 传输层概述 “三次握手,四次挥手”你真的懂吗? 传输层上的TCP和UDP TCP/IP协议是一个协议簇.里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TC ...

  9. JavaScript 2019.3.15

    方法名.call(对象)可以切换方法调用的对象 参数数量 基本数据类型 typeof无法更细致的区分引用类型(全是object) =

  10. HDU 2094产生冠军(set思维题)

    Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能 ...