java threadlocal 背景 本质
背景
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 背景 本质的更多相关文章
- attilax.java 注解的本质and 使用最佳实践(3)O7
attilax.java 注解的本质and 使用最佳实践(3)O7 1. 定义pojo 1 2. 建立注解By eclipse tps 1 3. 注解参数的可支持数据类型: 2 4. 注解处理器 2 ...
- 《Java大学教程》—第24章 Java的背景
本章主要介绍的是Java的背景知识,通过了解历史知道Java与其他语言的区别,以便更好选择在什么场景下使用Java. 24.2 语言的尺寸Java语言短小.紧凑,以C++为基础,放弃了一些特定的 ...
- Java ThreadLocal的使用
Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量.因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread ...
- Java ThreadLocal 源代码分析
Java ThreadLocal 之前在写SSM项目的时候使用过一个叫PageHelper的插件 可以自动完成分页而不用手动写SQL limit 用起来大概是这样的 最开始的时候觉得很困惑,因为直接使 ...
- java threadLocal的初探
在网上找了半天,终于找到一篇靠谱的文章了. 文章地址:http://qifuguang.me/2015/09/02/[Java%E5%B9%B6%E5%8F%91%E5%8C%85%E5%AD%A6% ...
- Java ThreadLocal Example(java中的ThreadLocal例子)
Java ThreadLocal is used to create thread local variables. We know that all threads of an Object sha ...
- 一句话,讲清楚java泛型的本质(非类型擦除)
背景 昨天,在逛论坛时遇到个这么个问题,上代码: public class GenericTest { //方法一 public static <T extends Comparable< ...
- 初识Java ThreadLocal
转载自:https://www.cnblogs.com/dreamroute/p/5034726.html ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量. 这个玩意有什么用处,或 ...
- java ThreadLocal(应用场景及使用方式及原理)
尽管ThreadLocal与并发问题相关,可是很多程序猿只将它作为一种用于"方便传參"的工具,胖哥觉得这或许并非ThreadLocal设计的目的,它本身是为线程安全和某些特定场景的 ...
随机推荐
- 干货分享:Essay写作收集论据的三个方法
在很多时候,中国留学生写出的Essay在西方学术界看来是存在plagiarism的情况.并不是说咱们写的所有东西都是抄袭,而是思维逻辑和利用证据的方式与西方权威的academic writing不同. ...
- quartz详解3:quartz数据库集群-锁机制
http://blog.itpub.NET/11627468/viewspace-1764753/ 一.quartz数据库锁 其中,QRTZ_LOCKS就是Quartz集群实现同步机制的行锁表,其表结 ...
- LVM中逻辑卷的最大大小限制
前言: 本文是对这篇博客Maximum Size Of A Logical Volume In LVM的翻译,敬请尊重原创和翻译劳动成果,那些随意转载的大爷们,好歹也自觉注明出处.谢谢! 英文原文地址 ...
- 51nod1007:正整数分组 DP
1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 ...
- 使用NtQueryInformationFile函数获得不到完整路径
#include <windows.h> #include <iostream> using namespace std; typedef struct _OBJECT_NAM ...
- 连接数据库方法2-DBCP
DBCP(连接池): 解决对数据库建立以及关闭连接时消耗大量资源的解决方案. 程序创建和关闭对数据库连接时会消耗大量的资源,连接池技术帮我们 在程序运行的开始时就预先创建大量的连接,这些连接组成一个池 ...
- Golang的学习方法
- 转载:Apache优化:修改最大并发连接数
本文转自:https://blog.csdn.net/bjash/article/details/50394894 Apache是一个跨平台的web服务器,由于其简单.稳定安全的特性,被广泛应用于计算 ...
- js判断苹果和安卓端或者wp端
最近做了一个H5,说要提供一个底部,可以区分安卓或者ios,到相应的网址进行下载APP,如图: 代码如下: window.onload = function () { var u = navigat ...
- 剑指offer【08】- 二叉树的深度(java)
题目:二叉树的深度 考点:知识迁移能力 题目描述:输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 牛客网上的剑指offer题, ...