ThreadLocal类

Java并发:InheritableThreadLocal详解 概述最新看项目代码时, 发现有地方用到了InheritableThreadLocal,之前只用过ThreadLocal,于是就查了点资料,看了下源码,稍微学习一下。InheritableThreadLocal是ThreadLocal的子类,可以先了解下ThreadLocal:Java并发:ThreadLocal详解1.定义InheritableThreadLocal继承了ThreadLocal,此... 阅读详情

文件路径:
./libcore/ojluni/src/main/java/java/lang/ThreadLocal.java

ThreadLocal

概述:
提供线程本地变量. 此变量不同于一般变量,每个线程都访问(通过get和set)各自的副本.
独立初始化变量的副本. ThreadLocal实例是类的典型的私有静态域,是与线程状态相关的
(例如: 用户ID或事务ID)
每个线程持有一个Thread-Local变量的副本的隐式引用,只要线程存活和ThreadLocal可获取;
在线程消失后,thread-local实例被GC(除非还有其他的引用)
ThreadLocals依赖于附着在各个线程的hashmap.
ThreadLocal对象行为像键Key,通过threadLocalHashCode加快搜索.

 主要原理:
 每个线程有一个threadLocals成员变量(类型为ThreadLocal.ThreadLocalMap). 当使用到ThreadLocal时,此变量初始化(延时初始化).
 ThreadLocal.ThreadLocalMap为静态内部类,有成员变量table. table为 Entry数组,而Entry用来保存ThreadLocal键值对. 每set一个ThreadLocal键值对, table就添加一条Entry. remove则table移除一条Entry. 需要搜索时,用threadLocalHashCode辅助.
 当一个ThreadLocal对象在不同线程操作时,实际是在各自线程的ThreadLocalMap(threadLocals成员变量)的table上操作以此对象为key的Entry.

函数说明
nextHashCode
initialValue返回当前线程的初始化值,对这个thread-local变量. 此方法将在线程第一次通过get方法访问变量时被调用,除非线程先前调用了set方法,在这种情况下initialValue将不再被线程调用。一般情况下,此方法每个线程最多调用一次,但是在get后一旦子序列调用remove,可能再调用.
withInitial创建一个thread local变量.变量的初始值由调用Supplier的get决定.
get返回当前线程的这个thread-local变量的映射值. 如果变量没有当前线程的值,它第一次初始化的值是由initialValue方法的调用返回
setInitialValueset的变种,用来建立初始值.
set设置当前线程的thread-local变量为指定值.
remove移除当前线程的thread-local值
getMap获得线程的ThreadLocalMap
createMap创建与线程相关的ThreadLocalMap
createInheritedMap工厂模式创建可继承的thread locals
childValue当继承父类map时,子类获取的值

ThreadLocal.SuppliedThreadLocal

ThreadLocal的扩展,从指定的Supplier获取初始值

ThreadLocal.ThreadLocalMap

ThreadLocalMap自定义hash map,仅适应维护thread local值.
没有操作被输出到ThreadLocal外.为了帮助处理大的和长生命周期的使用,
hash table对key使用了WeakReferences. 然而,由于参考队列没有使用,
获得的旧的entries被移除仅当table运行超出作用域.

静态内部类
定义
INITIAL_CAPACITY初始化Entry表的容量,必须是2的指数倍
tabletable.length必须是2的指数倍,必要时改变大小
sizetable中的entries数
threshold当达到值时需要改变大小

函数
ThreadLocalMap(ThreadLocal,Object) :
构建一个新的Map初始值包含(firstKey,firstValue).ThreadLocalMap是延时构建,所以仅当有需要
放入(put)时才构建

ThreadLocalMap(ThreadLocalMap):
构建map从给定的父map中继承ThreadLocals; 仅被createInheritedMap调用; 子类继承的值可能不同,见childValue

getEntry:
查询key对应的Entry; 直接比对hashcode对应的,如果不匹配,再全搜索匹配,因为可能重排过

getEntryAfterMiss:
全搜索查询,直至查询完

setThreshold:
设置限值为参数的2/3

set:
设置与key相关的值; 如果对应的table不为空,则向后移; 清除无用的,调整大小

remove:
移除键的Entry

replaceStaleEntry:
交换slot的键值,可能做一些清除操作

expungeStaleEntry:
清除staleSlot,并可能重hash

nextIndex:
以len为模增加i

prevIndex:
以len为模减小i

cleanSomeSlots:
启动扫描一些单元查询旧的条目(entries). 这在一个新的元素添加或一个旧元素清除时.
它执行一个逻辑算法的扫描,为了平衡完全不扫描(快速但是保留了垃圾)和与元素成
比例的扫描次数(这将搜索出所有的垃圾,但可能花费O(n)的时间)之间的平衡.
i: 已知的不是旧元素的位置,从此后开始扫描
n: 扫描控制; log2(n)个单元将被扫描,除非有一个旧条目(entry)被找到,这样log2(table.length-1)
个额外单元被扫描. 当插入时,此参数是元素数量,但是当从replaceStaleEntry调用时,它是table长度
(注意:所有这些将被改变为n的权重,替换log n.但是这个版本更简单,快速,并且看起来工作良好)

rehash:
首先移除旧的条目. 如果条件满足,重新调整大小.

resize:
将大小翻倍,并重排

expungeStaleEntries:
清除表中所有旧的条目

ThreadLocal.ThreadLocalMap.Entry

此hash map继承于WeakReference,使用它的主引用域作为key(将一直是ThreadLocal对象),
注意null键表示没有引用,因此entry可以被删除

小结:

每个线程对应一个ThreadLocalMap
Thread <—对应—> ThreadLocal.ThreadLocalMap
每个ThreadLocalMap中包含一个Entry数组
Entry数组中每一项存储一个ThreadLocal键值对< ThreadLocal, Value >
一个ThreadLocal对象对应一个值

RNA-Seq数据分析实战:从FastQC到STAR比对的完整流程(附避坑指南) 本文提供了RNA-Seq数据分析从FastQC质控到STAR比对的完整实战流程与避坑指南。详细解读了FastQC/MultiQC报告的关键指标,并重点阐述了STAR比对工具的核心参数设置、索引构建及性能优化策略,旨在帮助用户获得准确可靠的比对结果,为下游基因表达分析奠定坚实基础。 阅读详情

相关推荐

汽车级智能栅极驱动器深度解析 | 连载01:DRV871x-Q1系列产品架构与核心特性

集成度:单芯片集成多通道驱动器、电源管理、电流检测智能化:自适应控制算法,减少外部元件可靠性:多重保护机制,满足汽车级要求灵活性:SPI和硬件两种接口,适应不同应用需求。

VehSwHwDeveloper的博客 1154

ThreadLocal 子类及实现原理

我们在介绍threadLocal子类及实现原理之前,先介绍一下threadLocal类。 ThreadLocal类 ThreadLocal原理 ThreadLocal 是为了解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal 并不是一个Thread,而是 Thread 的局部变量。 ThreadLocal 用于保存某个线程共享变量:对于同一个 static ThreadLocal,其为...

有个疙叫瘩儿的博客 760

WPS用户看过来:避开格式错乱坑,用WPS Office完美制作红头文件(2024最新版)

本文详细解析了WPS Office与Word在红头文件制作中的核心差异,提供了2024年最新版的零误差实战指南。从字体处理、页面布局到红头制作关键步骤,帮助用户避开格式错乱坑,确保跨设备显示一致。特别针对WPS用户优化,解决字体丢失、版式错位等常见问题。

weixin_26800111的博客 218

ThreadLocal类和InheritableThreadLocal类

ThreadLocal 使用场景:在需要定义一个全局变量时,多个线程访问,不希望线程之间互相影响 作用:线程隔离,提供线程全局变量。 原理:ThreadlLocal类中有ThreadLocalMap

h1072957322的博客 563

Outlook总是提示登录微软,怎么办?

Outlook 2021反复弹出Microsoft登录窗口,可能是由于Modern Authentication身份验证机制或凭据问题导致。解决方案包括:1)通过注册表关闭Modern Authentication(适用于本地Exchange);2)清理Windows凭据管理器中的旧认证信息;3)手动配置Exchange服务器地址;4)通过注册表阻止Microsoft登录窗口弹出(适用于非M365环境)。建议按顺序尝试,尤其前两步通常能解决问题。经测试,步骤1和2已有效解决该问题。

剪刀石头布 4679

HLM(多层线性模型)在stata中语句

在阅读CEPS中发现有些研究采用的是HLM模型,HLM简单来说用一个方程跑两个回归。举例,对学习成绩影响因素,不同层有不同的影响,如在个体层面上个体特征会对成绩产生影响,在学校层面学校排名等因素会对成绩产生影响,两种因素不在一个层面,每层造成的差异都不相同。 在找相关语句时候发现操作这个语句的软件大多是SPSS和HLM,对于stata操作者并不友好。因此,在有限资料中总结了HLM在stata中的语句,后面会附上学习视频和链接。 先放语句,后面对方程式一个大致解析。由于针对HLM有一本书的介绍,可能一篇文章无

weixin_44652251的博客 1万+

ThreadLocal精进篇:子线程类InheritableThreadLocal

ThreadLocal可以保证在当前运行线程中的变量不被其他并发下的线程共享。 但是如果在代码中需要使用多线程呢? ThreadLocal是否该如何保证相关子线程下的数据的传递安全性呢? InheritableThreadLocal给我们提供了一丝可能。 InheritableThreadLocal InheritableThreadLocal源码 先简单瞄下源码 package java.lang; import java.lang.ref.*; public class Inher..

沛哥儿的专栏 1497

利用pytorch长短期记忆网络LSTM实现股票预测分析

长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。LSTM主要就是加入了三个门控:第一个开关遗忘门:负责控制继续保存长期状态c;第二个开关输入门:负责控制把即时状态输入到长期状态c;第三个开关输出门:负责控制是否把长期状态c作为当前的LSTM的输出。

优快云 精品推荐 1万+

ThreadLocal,InheritableThreadLocal 使用及原理

理解ThreadLocal的原理,使用,破除一些ThreadLocal的迷信

jike920203的博客 1430

爬取Unsplash高清壁纸:Python爬虫实战教程(最新技术)

在当今数字化时代,高清壁纸已经成为人们个性化设备的重要元素。Unsplash作为全球最知名的免费高质量图片网站,汇集了数百万张由全球摄影师贡献的高清图片。然而,Unsplash官网的下载方式需要手动操作,对于需要批量下载壁纸的用户来说效率较低。本文将带你深入探索如何使用Python爬虫技术高效爬取Unsplash高清壁纸,从基础到进阶,全面掌握图片爬取的核心技术。Unsplash成立于2013年,是一个完全免费的图片分享平台。高质量内容:所有图片均由专业摄影师上传,分辨率普遍达到4K以上免费商用。

2201_76125261的博客 937

风控域——决策引擎系统设计

本文详细介绍了风控决策引擎系统的设计与应用。决策引擎系统是一种智能化工具,可自动化、数据驱动地辅助或替代人工决策,广泛应用于金融、医疗、营销、风控等领域。文章阐述了决策引擎的核心功能,包括自动化决策、动态规则管理、实时处理和模型集成,以及系统组成,涵盖数据输入层、规则引擎和模型服务层。此外,还探讨了决策引擎的典型应用场景、技术架构、组件设计,以及风控决策引擎系统的技术方案、设计难点和重点。

庄小焱 3321

ThreadLocal类的定义

在 Java 中,类位于java.lang包下,它为每个使用该变量的线程都提供一个独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。简单来说,提供了线程局部变量,每个线程都有自己专属的变量实例。这在多线程环境下,当某些数据是以线程为作用域并且不同线程具有不同的数据副本时非常有用,例如数据库连接、用户身份信息等。通过对类的学习,我们了解到它在多线程编程中为每个线程提供独立变量副本的重要作用。与普通变量相比,具有数据隔离性,能有效避免多线程访问共享变量时的数据不一致问题。掌握。

SSSYUsssyu的博客 528

【OpenClaw从入门到精通】第01篇:保姆级教程——从零开始搭建你的第一个本地AI助理(2026实测版)

本文聚焦2026年开源AI代理工具OpenClaw的本地部署与实操,从核心概念拆解入手,先厘清OpenClaw、Gateway、Skills、ClawHub的关联,再明确硬件系统要求与大模型API-Key准备要点,通过官方一键安装脚本完成本地部署,并配置阿里云百炼API实现大模型对接。以“让AI助理抓取开源中国热门项目”的虚拟实战案例,详细演示Skills调用流程,同时梳理部署中“命令找不到”“API-Key配置失败”等高频问题的解决方法。内容兼顾新手友好性与实操参考性,所有步骤均基于公开技术文档验证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 4万+

ThreadLocal类基本使用

在多线程场景中,有一个常用的类ThreadLocal,该类作为一个桥梁可以将线程要操作的全局变量和线程本身绑定: 如下多线程测试程序: package test.HimmaQ; class Channel { //消息发送通道 private static Message message; private Channel(){}; publi...

125

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java——ThreadLocal类介绍

本文详细剖析ThreadLocal的工作原理,通过数据库连接管理案例演示线程隔离机制,结合Tomcat线程池场景解释remove()的必要性,分析内存泄漏成因及解决方案,帮助开发者正确使用这一多线程利器。

m0_73941339的博客 1139

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ThreadLocal类详解

类是Java提供的一种线程局部存储,它为每个使用该变量的线程提供一个独立的变量副本。这意味着,每个线程可以访问自己内部的变量,而不会和其他线程的变量冲突。实例通常被声明为类型。总结来说,不是为了解决多线程访问共享变量的问题,而是为每个线程创建一个单独的变量副本,提供保持对象的方法和避免参数传递的复杂性。使用,建议用static。

2401_85373732的博客 1142

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ThreadLocal 类

ThreadLocal 类精讲 文章目录ThreadLocal 类精讲1. ThreadLocal 概述2. 提供线程上下文能力3. 线程上下文的延迟加载4. 单线程绑定多 ThreadLocal 实例5. 单 ThreadLocal 实例被多个线程共享6. 线程上下文的内存回收问题7. InheritableThreadLocal 类 1. ThreadLocal 概述 ThreadLocal ...

li_xunhuan的博客 782

编写Java程序,使用ThreadLocal类,项目中创建账户类 Account,类中包括账户名称name、 ThreadLocal 类的引用变量amount,表示存款

查看本章节 查看作业目录 需求说明: 某用户共有两张银行卡,账户名称相同,但卡号和余额不同。模拟用户使用这两张银行卡进行消费的过程,并打印出消费明细 实现思路: 项目中创建账户类 Account,类中包括账户名称name、 ThreadLocal 类的引用变量amount,表示存款 创建消费类 DailyConsmption实现Runnable 接 口。声明 账户类型的引用 account, 使 用new Random() 实例化一个随机类对象 random,并定义一个初始化账户的构造方法

杨明金的博客 6578

java 基础 ThreadLocal类介绍

java 基础 ThreadLocal类介绍

骑牛小道士 1100

ThreadLocal中类图

ThreadLocal中类图:

有料,有味,很重要 474

ThreadLocal类的作用,原理和应用场景

ThreadLocal类的作用 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改,这就是ThreadLocal类的作用 什么意思呢,我们看下面的代码,我们看到结果应该是萧一和萧二和萧三增加之后的年龄应该都是增加2,但是结果呢,萧二是增加了2,然后萧一增加了4,然后萧三增加了6,这就有问题了 packag...

IT乾坤的博客 7469

浅谈ThreadLocal类

浅谈ThreadLocal类1-  ThreadLocal类ThreadLocal是在java.lang包下的类,可见这是一个非常重要的类!这个类有什么作用呢?什么情况下需要使用这个类呢?首先看看jdk中的关于这个类的注释:以下截取了部分ThreadLocal类的注释:这个类(ThreadLocal)提供了线程局部变量。线程局部变量与普通变量的不同之处在于线程局部变量是每一个线程都维护了一份副本的...

weixin_38810239的博客 1676

ThreadLocal类浅析

类图

岁月静好 825

JAVA中的ThreadLocal类

ThreadLocal类是Java提供的一个线程局部变量工具类,它可以在多线程环境下为每个线程提供一个独立的变量副本,从而实现线程间的数据隔离。以下是关于ThreadLocal类的详细介绍、代码例子、运行结果及注释。定义:ThreadLocal类位于java.lang包下,用于实现线程局部变量。作用:为每个使用该变量的线程提供一个独立的变量副本,实现线程间的数据隔离。

qa3629723的博客 627
上一篇: android.os.SystemClock类
下一篇: 《Java网络编程》摘要
ProgramResearch
博客等级 码龄11年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值