【java基础知识】『5』ThreadLocal@Thread@ThreadLocalMap的关系认识&内存泄漏原因分析

KMM 入门(五)处理多线程 为什么需要在 KMM 中处理多线程? 我们使用 KMM,通常是处理和 UI 无关的业务逻辑,所以多数情况是网络请求、数据缓存、文件读写等操作,为了不影响 UI 绘制,这些操作往往都会在异步线程中执行,而 KMM 模块的线程切换,调用方肯定是不应该去管理的,所以需要探索一种在 KMM 中比较靠谱的多线程处理方式 可行的多线程切换方式 协程(kotlinx-coroutines) Kotlin 协程不依赖于 JVM 实现,可以应用在 Kotlin Native 项目当中,不需要再实现平台差异化代码,且协程开 阅读详情

(一)、基础知识普及

(1.1)内存泄漏(out of memory):不会再被使用的对象或者变量占用的内存不能被回收或释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果,就是内存泄漏,一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早会被占光,最终导致内存溢出

(1.2)内存溢出(Memory Leak):通俗的讲就是内存不够,通常是运行的程序所需要的内存远远的超过了主机内存的所承受的大小

强引用 弱引用 软引用 虚引用

  1. 强引用 一个对象具有强引用,不会被垃圾回收。当内存空间不足,java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象,如果想取消这种关联,可以显示地将引用赋值为null
  2. 弱引用 JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象,在java中用WeakReference类来表示
  3. 软引用 当内存不足时,就会回收,在java中用SoftReference类来表示
  4. 虚引用 忽略

(1)Thread,ThreadLocal,ThreadLocalMap 关系如下图

Thread,ThreadLocal,ThreadLocalMap 关系

(1)Thread,ThreadLocal,ThreadLocalMap 内存模型图

ThreadLocal的内存泄露?什么原因?如何避免?
对象内存模型图

通过源码发现,ThreadLocalMap 是Thread的一个类变量,之所以能让线程之间的数据互相不受影响,就是这个原因,如下:

而Entry[]又是ThreadLocalMap的一个成员变量,它是针对一个线程有多个ThreadLocal变量使用的情况,其对象Entry的Key和Value分别是我们的ThreadLocal实例和设置的值,只是ThreadLocalMap是ThreadLocal的一个静态内部类,而Entry又是ThreadLocalMap的一个静态内部类。

如下所示,10000个线程内部的Entry的Key还是同一个ThreadLocal对象实例

多线程操作同一个threadlocal实例

拓展点:分析上面图片,不会出现安全问题,因为设置进去的值是放在ThreadLocalMap里面的,而ThreadLocalMap是每个Thread里面的变量,所以不会出现安全问题     

(二)、ThreadLocal内存泄漏的原因分析

从上面的内存模型可以看出,ThreadLocalMap使用ThreadLocal实例的弱引用作为key,如果一个ThreadLocal不存在外部强引用(ThreadLocal的变量指向对象)时,key(ThreadLocal)势必会被GC回收,这样就会导致ThreadLocalMap中的key变为null,而value还存在着强引用,只有thread线程退出去以后,value的强引用链条才会断掉,但如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref ->Thread ->ThreadLocalMap ->Entry -> value,永远无法回收,造成内存泄漏;那么如果ThreadLocalMap的key改为强引用是不是就没有内存泄漏了呢?其实是一样的道理,只是ThreadLocalMap的key就会内存泄漏了

解决方法:

  1. 每次使用完ThreadLocal都调用它的remove()方法清除数据
  2. 将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉

 

聊一聊ThreadLocal内存泄漏的问题 ThreadLocal你真的懂了吗? 阅读详情

相关推荐

【校招】SHL 的 General Ability (GA, 通用能力测试)

SHL 的 General Ability (GA, 通用能力测试) 文章目录SHL 的 General Ability (GA, 通用能力测试)1、归纳推理题1.1 圈圈线条推理1.2 图形颜色位置推理1.3 箭头指向推理2. 数字推理题攻略3. 语言推理题 1、归纳推理题   归纳推理题我把它总结为三种类型:圈圈线条推理;图形颜色位置推理;箭头指向推理。 1.1 圈圈线条推理   你别看这个题目看起来很复杂,其实很简单,而且这个题型的题目背后原理都一样!我把我的 tips 偷偷分享给你们嘿嘿~先从 A

Sunnyside_ 2万+

ThreadLocal和ThreadlocalMap的关系

threadlocal和threadlocalmap的联系

Weishaolei0818的博客 590

MCP详解:手把手教你理解和如何使用各种开源MCP服务

MCP 作为一种开放协议,为 AI 模型与外部世界的连接提供了标准化的解决方案。它不仅降低了开发门槛,还极大地扩展了 AI 应用的边界。无论是开发者还是普通用户,都可以通过 MCP 更高效地利用 AI 技术,实现更多智能化的功能。

王哥儿聊AI的博客 6056

ThreadLocal 6:Thread,ThreadLocal,ThreadLocalMap的关系;

说明: (1)本篇博客,主要分析Thread,ThreadLocal,ThreadLocalMap的关系;同时,结合三者的关系,继续深化分析get(),set(),remove()方法; 目录 一:Thread,ThreadLocal,ThreadLocalMap:三者的关系; 二:结合【Thread,ThreadLocal,ThreadLocalMap:三者的关系】进一步分析get(),set(),remove(); 1.进一步分析:get()方法; 2.进一步分析:set()方法; ..

小枯林的博客 2180

SAP Script表单开发中ABAP preform方法的实战应用与调试技巧

本文深入探讨了在SAP Script表单开发中调用ABAP程序(preform方法)的实战应用与调试技巧。通过一个获取供应商版本名称的实例,详细讲解了如何在SE71中嵌入PERFORM指令、编写ABAP子程序进行数据查询与处理,并重点介绍了使用SAP Script Debugger进行高效调试的方法,帮助开发者灵活扩展表单功能,实现复杂业务逻辑。

o0p1q2r3的博客 551

AI驱动视频剪辑自动化:cutcli命令行工具重塑工作流

视频剪辑自动化是提升内容生产效率的关键技术,其核心原理在于通过程序化指令替代手动操作,将创意执行过程代码化。这项技术的价值在于能够将创作者从重复性劳动中解放,实现批量化、标准化的视频内容生产,尤其适用于社交媒体运营、产品宣传等高频产出场景。通过封装专业软件(如剪映/CapCut)的底层草稿格式,自动化工具在保证工业级渲染质量的同时,提供了可编辑的中间态,为AI智能体(Agent)与生产工具的结合提供了清晰接口。本文以cutcli为例,深入探讨了如何通过命令行工具和AI助手,构建从自然语言指令到可编辑视频草稿

weixin_27210125的博客 1064

ThreadLocal,Thread,ThreadLocalMap之间的关系

ThreadLocal,Thread,ThreadLocalMap之间的关系 Thread源码 public class Thread implements Runnable { ThreadLocal.ThreadLocalMap threadLocals = null; } ThreadLocal源码 public class ThreadLocal<T> { static class ThreadLocalMap { static cl

liang博客 1166

TIM 2024 | AD-YOLO:一种结合 Swin Transformer 和注意力机制的实时 YOLO 网络用于机场场景检测

实时获取机场场景信息对于保障机场安全和提升机场运营效率至关重要。然而,机场场景图像中的人员和车辆目标尺寸较小,而且公开的机场数据不足,这使得机场物体检测成为一项颇具挑战的任务,难以同时实现高精度和实时检测。本文提出了一种全新的机场物体检测方法——机场检测器YOLO(AD - YOLO),它融合了改进的你只看一次(YOLO)算法、Swin Transformer和注意力机制的优势,以应对这一挑战。

小白学视觉 315

Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用

本文深入解析了Java中Thread、ThreadLocal和ThreadLocalMap的关系及实现原理。ThreadLocal通过ThreadLocalMap为每个线程存储本地变量,采用弱引用避免内存泄漏。主要应用场景包括用户上下文传递、数据库事务管理、日志追踪ID等。使用时需注意在finally块或AOP中调用remove()清理资源,特别是在线程池环境下,防止内存泄漏和数据污染。推荐结合try-finally或Spring AOP实现自动清理机制,确保线程安全。

lfeishumomol的博客 1339

用 ABAP LSMW 的 Standard Batch / Direct Input 稳准快迁移物料主数据:从 MM01 录制到 RMDATIND 直入的落地指南

本文详细介绍了SAP数据迁移中LSMW工具的使用方法,重点分析了物料主数据迁移的两种主要路径:Batch Input Recording和Standard Batch/Direct Input。前者通过录制事务操作实现快速起步,后者通过调用预置接口程序实现稳定高效的批量处理。文章深入解析了Standard Direct Input的具体实施步骤,包括对象属性设置、源结构定义、字段映射规则等关键环节,并特别强调了迁移前的准备工作(如编号策略、视图策略等)对项目成功的重要性。通过对比两种方法的优缺点,为不同业务

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

Cadence OrCAD Capture 保持元器件编号情况复制元件,复制后元器件编号与复制前不同的问题解决

如下图所示复制时,已经勾选了“Preserve reference on copy”但是复制后的编号却与复制前不一样。本文简单介绍其原因及解决方法。

fydar的博客 3165

ThreadLocal内存泄漏问题讲解

一、首先回顾一下内存泄漏是什么: 内存泄漏是指:程序已经不再使用某字段、某对象。但是却无法回收掉它占用的内存。 两个关键点:不再使用 并且 无法回收 二、为什么ThreadLocal会发生内存泄漏问题? 2.1 问题发现 以下是整体结构 ThreadLocal就相当于一个访问工具类,通过操作ThreadLocal对象的方法 来操作存储在当前线程内部的ThreadLocalMap里的值 ThreadLocalMap是一个哈希数组,key为ThreadLocal对象,Value为一个Objec

深度 3195

1、语义数据建模:避免陷阱与突破困境

本文探讨了语义数据建模的兴起背景、核心概念、生命周期及常见挑战。从数据丰富型组织和AI开发者的需求出发,分析了语义建模的关键元素和质量维度,并深入讨论了建模过程中可能出现的陷阱与解决方案。文章还针对语义模型的演化、治理和战略组织问题提供了突破思路,旨在帮助数据从业者更好地理解和应用语义建模技术,以提升数据驱动应用的有效性。

c8d9e0f1的博客 119

ThreadLocal的内存泄露问题

在上述所说的问题中,即使ThreadLocalMap中存在key为null的Entry,但是该Entry的value值并不会因为GC而被回收(value存本身就存着一个强引用的对象),所以就导致了该对象不会被回收掉而出现了内存泄露。假设如果存储的强引用,我们断开ThreadLocal Reference —> ThreadLocal的引用,会发现key强引用了ThreadLocal,导致该对象永远无法被GC。学习的过程中想到了一个问题,弱引用会不会导致运行过程中GC清除key,导致找不到对应的value?

sunao1106的博客 4759

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

探究-ThreadLocal内存泄露问题

探究这个问题之前,先来说说ThreadLocal是什么东西? ThreadLocal 翻译过来就是线程本地。它存储的内容只在当前线程可见,其他线程则访问不到。 下面看一段代码方便理解: 代码解读: 1. 定义成员变量ThreadLocal 2. 定义成员变量User对象 3. 定义线程1将User对象set进ThreadLocal中 线程1 通过get获取对象并打印 4. 定义线程2...

m0_57479908的博客 1021

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

面试官:说说ThreadLocal ,ThreadLocalMap 和Thread 的关系?我懵逼了

引言 这三种的关系由于大量的内部类的关系,第一次看的时候还是有点绕的,感觉你是老子的孙子,又是老子的老子。我还是建议你先抛开内部类的关系,把每一个类当作普通类来看到,理解每個类的职责,最后再把内部类放进去考虑这样设计的目的。这里也给大家一个启示,面对复杂的事情的时候,我们需要跳出来,先把问题简单化,大方向把握了,再进一步去细化每一个功能点和设计的艺术。 关系图解 接下来我们看下面一张图 从上图我...

qq_37595013的博客 1437

一图搞懂Thread和ThreadLocal以及ThreadLocalMap的关系

thread中有一个threadlocals变量,关联的是threadlocalmap,threadlocal中有threadlocalmap,threadlocalmap中有entry,entry帮助threadlocalmap存储threadlocal(本地线程,key)以及我们自己赋予的副本变量(value)。),而我们自己赋值的副本变量(value)是强引用。当java虚拟机进行gc的时候,key就会被清除(垃圾回收),但是value不会进行清除,会一直停留在内存当中,

weixin_45740885的博客 676

ThreadLocal的内存泄露?什么原因?如何避免?

在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露、强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这样情况发生,增强系统的健壮性。由于Thread中包含变量ThreadLocalMap,因此ThreadLocalMap与Thread的生命周期是一样长,如果都没有手动删除对应key,都会导致内存泄漏。但是使用弱引用。

daobuxinzi的博客 3827

Java内存泄露--ThreadLocal导致内存泄露--原因/解决方案

本文介绍为什么ThreadLocal会引起内存泄露以及如何避免ThreadLocal内存泄露。 之前介绍过ThreadLocal的原理,本文不再赘述。 本内容也是Java面试时经常会问到的问题。

IT利刃出鞘的博客 5390

ThreadLocal内存泄漏原因,如何避免

ThreadLocal内存泄漏原因,如何避免

weixin_43985221的博客 254

关于ThreadLocal,ThreadLocalMap,Thread的关系

ThreadLocal、ThreadLocalMap、Thread什么是ThreadLocal?ThreadLocal原理get方法set方法ThreadLocal、Thread、ThreadLocalMap三者的关系Hash冲突问题内存泄漏问题为什么会发送内存泄漏 ?如何解决内存泄漏问题? 什么是ThreadLocal? 官方解释:ThreadLocal是一个本地线程副本变量工具类,主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰。 白话:ThreadLocal就是给每个线程

Squid87的博客 1220

Thread、ThreadLocalMap和ThreadLocal的关系

ThreadLocal的理解: 其实,ThreadLocal并不是一个Thread,而是Thread的局部变量。可以看作Thread用来保存value的变量。一个ThreadLocal维护一个类型的value,相当于每一个ThreadLocal为key,对应value。 可以简单用一张图表示三者的关系: 图片来源:https://blog.youkuaiyun.com/Rinvay_Cui/article/details/111035071 相当于每一个Thread都维护一个各自的容器ThreadLocalMap,一

AllenTTTTT的博客 566

ThreadLocal、ThreadLocalMap、Thread关系详细解析

ThreadLocal、ThreadLocalMap、Thread详细解析

一个仰望天空的Man的博客 5213

详解Java中的ThreadLocal、ThreadLocalMap和Thread之间的关系

每个ThreadLocal实例都有一个唯一的threadLocalHashCode(这个值将会用于在ThreadLocalMap中找到ThreadLocal对应的value值),它是通过静态变量nextHashCode和HASH_INCREMENT进行计算的,其中nextHashCode 和HASH_INCREMENT 的定义如下 private static AtomicInteger nex

黑夜舞者的专栏 7770

ThreadLocal源码解析,以及ThreadLocal、ThreadLocalMap、Thread 三者之间的关系

ThreadLocal、ThreadLocalMap、Thread 三者之间的关系 ThreadLocalMap 是 ThreadLocal 的内部类,Thread 中有个 ThreadLocalMap 成员变量 threadLocals  ThreadLocal源码解析 下面看一下,jdk 关于 ThreadLocal api ThreadLocal类 g

三易专栏 4103

Thread ThreadLocal ThreadLocalMap 关系

1 . Thread 类里有一个变量,是 ThreadLocalMap 类型的,名为 threadLocals; 2.  ThreadLocalMap 的 key 为 ThreadLocal 变量引用, value 即为 ThreadLocal 存储的值; 3.  一般使用方法是建一个独立的类,里边存放 ThreadLocal 常量,以供其他线程使用 class MyThreadLoc...

shida's blog 762
上一篇: 【java基础知识】『4』JVM内存模型之Heap(堆)内存分析
下一篇: 【MySQL 】数据库加锁机制分析
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值