ThreadLocal详解,与 HashMap 对比

ThreadLocal原理,使用注意事项,解决哈希冲突方式->和HashMap对比
ThreadLocal 原理:
ThreadLocal 是 Java 中的一个线程级别的变量,它允许您在不同线程之间存储和访问相同变量的不同副本,每个线程都拥有自己的副本,互不干扰。ThreadLocal 的实现基于一个 ThreadLocalMap,其中键是线程,值是要存储的变量副本。每个线程都可以通过 ThreadLocal 获取和设置其副本,而不会影响其他线程的副本。

ThreadLocal 的基本原理如下:

每个线程都有一个 ThreadLocalMap,用于存储变量副本。
当调用 ThreadLocal 的 set 方法时,它会获取当前线程,并将变量值存储在该线程的 ThreadLocalMap 中。
当调用 ThreadLocal 的 get 方法时,它会获取当前线程,并从该线程的 ThreadLocalMap 中获取变量值。
这样,每个线程都可以独立地访问和修改自己的副本,而不会干扰其他线程的副本。ThreadLocal 在多线程环境中常用于存储线程相关的上下文信息,如数据库连接、会话信息等。

ThreadLocal 使用注意事项:

内存泄漏:由于 ThreadLocal 中的变量是线程级别的,如果不及时清理或移除,可能会导致内存泄漏。确保在使用完 ThreadLocal 后,调用 remove 方法清理资源。

并发访问:虽然 ThreadLocal 可以解决线程间变量访问的问题,但如果不注意同步,仍然可能在多线程环境中引入并发问题。ThreadLocal 本身不提供线程安全性。

适度使用:不要过度使用 ThreadLocal,因为每个线程都有一个副本,如果不谨慎使用,可能会占用大量内存。只在确实需要线程独立变量的情况下使用。

解决哈希冲突方式和与 HashMap 对比:

ThreadLocal 使用了哈希表的思想来实现,在 ThreadLocalMap 内部使用线性探测法解决哈希冲突。如果多个 ThreadLocal 产生哈希冲突,它们会使用线性探测法在数组中寻找空闲的槽位来存储变量副本。

与 HashMap 对比:

相同点:ThreadLocalMap 和 HashMap 都是基于哈希表实现的,用于存储键值对。
不同点:
ThreadLocalMap 的键是线程对象,而值是线程独立的变量副本。
HashMap 的键值对可以被多个线程共享,需要进行外部同步,而 ThreadLocal 变量是线程独享的,不需要额外的同步。
ThreadLocalMap 使用了线性探测法来解决哈希冲突,以确保线程安全。
HashMap 不仅可以用于多线程环境,还可以用于单线程环境。
总的来说,ThreadLocal 是一种用于在多线程环境中存储线程独立变量的机制,它的内部实现基于哈希表,并使用了线性探测法来解决哈希冲突。与 HashMap 相比,ThreadLocal 更适用于需要在线程之间保持独立状态的场景。但要谨慎使用,以避免内存泄漏和并发问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19776.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机的自动化编程语言:深度探索与未来展望

单片机的自动化编程语言:深度探索与未来展望 单片机作为现代电子设备的核心控制单元,其自动化编程语言的发展与应用,对提升设备性能、简化编程流程具有重大意义。本文将从四个方面、五个方面、六个方面和七个方面,对单片机的自动…

Day-04python模块

一、模块 1-1 Python 自带模块 Json模块 处理json数据 {"key":"value"} json不是字典 本质是一个有引号的字符串数据 json注意点 {} 中的数据是字符串引号必须是双引号 使用json模块可以实现将json转为字典,使用字典的方法操作数据 。 或者将…

社交媒体数据恢复:最右

第一步:确认数据丢失原因 请确定您是因为误删、设备损坏还是其他原因导致“最右”中的数据丢失。这将有助于您更好地了解需要采取的恢复措施。 第二步:尝试从备份中恢复数据 如果您有定期备份的习惯,请尝试从备份中恢复丢失的数据。备份文…

Springboot JVM监控 通过Promethus

Springboot内置了对Prometheus得支持,可以监测得点有: JVM各指标参数(GC,堆,非堆等)接口调用次数,延时系统内存,IO,CPU使用率 部署Prometheus和Grafana 准备一台2核4G…

局域网测速工具详解

使用好局域网测速工具可以帮助我们: 1. 网络性能评估 - 确定带宽:测量网络的实际上传和下载速度,以确定是否满足业务需求。 - 检测延迟和抖动:评估网络传输中的延迟和抖动,确保实时应用(如VoIP、视频会议&a…

问题排查|记录一次基于mymuduo库开发的服务器错误排查(段错误--Segmentation fault (core dumped))

问题记录: 在刚完成mymuduo库之后,写了一个简单的测试服务器, 但是在服务器运行后直接报错: cherryhcss-ecs-4995:~/mymuduo/example$ ./testserver Segmentation fault (core dumped)出现多错误这通常意味着程序试图访问其内存空…

解决Mybatisplus中没有Db类静态工具的方案--提高版本

方案&#xff1a;将两个的版本都提高即可解决 Mybatis—plus的依赖文件 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version></dependency><!-- ge…

Linux module参数传递

一、Linux Module参数传递 在C 语言中&#xff0c;可以在main函数利用argc、argv获取用户的输入&#xff0c;Linux驱动同样可以传递参数&#xff0c;下面简要介绍参数宏的使用方法 利用下面宏定义的参数可以在下面路径找到 /sys/module/xxxxx/parameters/ 1、module_param() …

STM32自己从零开始实操03:输出部分原理图

一、继电器电路 1.1指路 延续使用 JZC-33F-012-ZS3 继电器&#xff0c;设计出以小电流撬动大电流的继电器电路。 &#xff08;提示&#xff09;电路需要包含&#xff1a;三极管开关电路、续流二极管、滤波电容、指示灯、输出部分。 1.2数据手册重要信息提炼 联系排列&…

手写HTML字符串解析成对应的 AST语法树

先看效果 展示如下&#xff1a; HTML模版 转成ast语法树后 在学习之前&#xff0c;我们需要了解这么一个问题&#xff0c;为什么要将HTML字符串解析成对应的 AST语法树。 为什么&#xff1f; 语法分析&#xff1a;HTML字符串是一种标记语言&#xff0c;其中包含了大量的标签…

使用PNP管控制MCU是否需要复位

这两台用到一款芯片带电池&#xff0c;希望电池还有电芯片在工作的时候插入电源不要给芯片复位&#xff0c;当电池没电&#xff0c;芯片不在工作的时候&#xff0c;插入电源给芯片复位所以使用一个PNP三极管&#xff0c;通过芯片IO控制是否打开复位&#xff0c;当芯片正常工作的…

python移动文件

测试1(直接把B文件夹移动到了A里&#xff0c;成为了A的子文件夹) import os import shutil# 移动文件夹,B文件夹在当前目录没有了&#xff0c;跑到了A的子文件里 ## shutil.move(./example1/B/, ./example1/A/)测试2(B文件不动&#xff0c;将B文件里的所有的子文件夹移动到A内…

响应式UI组件DevExtreme中文教程 - 工具栏的自适应模式

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序。从Angular和Reac&#xff0c…

Android高通 12/13 录屏流程代码位置

需求如下图 实现系统录屏功能 frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord 涉及代码 ScreenRecordDialog # startBtn RecordingService # startRecording# stopRecording ScreenMediaRecorder # start # end #save 1、点击开始录屏framewo…

金融科技发展报告:移动支付的市场格局与趋势

引言 随着科技的飞速发展,金融科技已成为推动全球经济发展的重要力量。移动支付作为金融科技的重要分支,其市场格局与趋势日益受到业界的关注。本文将深入剖析移动支付的市场格局,探讨其发展趋势,并辅以相关案例作为辅助。 一、移动支付市场格局 1、全球市场概览 移动支…

python-pytorch编写transformer模型实现翻译0.5.00-写模型

前言 在网上看了一篇文章,借用了文章的大部分代码,并对代码的预测进行修改使得可以正确的预测了,具体链接找了半天找不到 代码 import numpy as np # 导入 numpy 库 import torch # 导入 torch 库 import torch.nn as nn # 导入 torch.nn 库 d_k = 64 # K(=Q) 维度 d_v =…

vscode怎么点击路径直接跳转对应文件

在vue项目中经常要引入工具类、组件、模版等&#xff0c;想要直接去看对应文件&#xff0c;只能自己找到对应路径再去打开。 我们可用在js项目中创建一个 jsconfig.json文件&#xff0c;TS项目可以创建tsconfig.json 文件代码 {"compilerOptions": {"baseUrl&…

52-QSplitter类QDockWidget类

一 QSplitter类 Qt提供QSplitter(QSplitter)类来进行分裂布局&#xff0c;QSplitter派生于QFrame。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~…

linux /www/server/cron内log文件占用空间过大,/www/server/cron是什么内容,/www/server/cron是否可以删除

linux服务器长期使用宝塔自带计划任务&#xff0c;计划任务执行记录占用服务器空间过大&#xff0c;导致服务器根目录爆满&#xff0c;需要长期排查并删除 /www/server/cron 占用空间过大问题处理 /www/server/cron是什么内容&#xff1f;/www/server/cron是否可以删除&#xf…

vue2 bug 小白求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 具体流程&#xff1a; 页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 返回页面后页面没有刷新导致用户名还显示这 项目中没有用keep-alive缓存 也在设置了key 尝试了window.removeEventLi…