背景

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. Vue.js(20)之 封装字母表(是这个名字吗0.0)

    HTML结构: <template> <div class="alphabet-container"> <h1>alphabet 组件</ ...

  2. AD软件将PCB中的元器件旋转45度

  3. group_concat用法以及字符串太长显示不全

    由于group_concat默认的长度是1024,所以要将最大长度修改 首先执行 SET SESSION group_concat_max_len = 10240;#一次查询有效 然后再进行拼接 se ...

  4. outlook 2013邮件在服务器保留副本

    用outlook2013来收邮件确实是比较方便,但是它收邮件默认设置是:当outlook2013将在线邮箱的邮件下载至本机计算机之后,它就会删除在线邮箱中的邮件.不知道是不是以前邮箱容量比较小,所以要 ...

  5. UVA 127 链表和栈的使用

    刘汝佳的题目感觉都是比较难以处理的,就像这道题目,一看数据简直觉得头大...加上这个英文我也看的想死 最后看别人博客的题意讲解才知道原来是要移牌. 然后如果熟练的使用stack和手写链表的话,这个题目 ...

  6. 2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem

    2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem 题意: 给定一个长度为\(n\)的序列,有两种操作: 1:单点修改. 2:查询区间\([L,R]\)范围内所有子 ...

  7. [极客大挑战 2019]EasySQL

    万能密码直接登陆得到flag admin' or 1=1 #

  8. 关于scala工程结构(使用sbt)

    scala_project:常用目录结构: |lib:手动添加依赖包 |project | |build.properties:build的版本号,可以不写,会自动下载 | |plugins.sbt: ...

  9. iOS 蓝牙开发详解

    目前iOS智能硬件的开发交互方式主要分为两种,一种是基于低功耗的蓝牙4.0技术(由于耗电低,也称作为BLE(Bluetooth Low Energy))对应iOS的框架为CoreBluetooth,另 ...

  10. java this的用法以及原理

    /** * this存在方法中,在方法中被调用. * 且是非static方法中被调用.(this 表示这个类的当前实例,而静态方法不依赖于该类的任何实例,随着类产生而装载,因此方法内不能引用 this ...