java多线程之ThreadLocal详解

ThreadLocal

      • 一、ThreadLocal概述
      • 二、ThreadLocal解决并发时的线程不安全问题
      • 三、ThreadLocal的工作原理

一、ThreadLocal概述

ThreadLocal 是一个线程变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,例如A线程和B线程都想使用一个变量,此时就存在竞争资源的问题,而这个变量他可以有多份,此时就可以用ThreadLocal作为变量的管理者 ,不存在多线程隐患.。同时它隐式的可以作为一个线程内部的传递信息的一个工具。
ThreadLocal的特点包括线程本地化存储、简化线程安全编程、避免多线程共享状态等。

二、ThreadLocal解决并发时的线程不安全问题

ThreadLocal从另一个角度来解决线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。例如在多线程中都去使用一个对象,但是又希望互不干涉,此时就需要用到ThreadLocal。实现线程间数据的隔离,保证各个线程之间的数据独立存储,同时也能实现某些数据的共享和传递
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

三、ThreadLocal的工作原理

ThreadLocal是作为当前线程属性ThreadLocalMap集合中的某一个Entry的key值Entry(threadLocal,value),虽然不同的线程之间threadlocal这个key值是一样,但是不同的线程所拥有的ThreadLocalMap是独一无二的,也就是不同的线程间同一个ThreadLocal(key)对应存储的值(value)不一样,从而到达了线程间变量隔离的目的,但是在同一个线程中这个value变量地址是一样的。

//ThreadLocal中主要使用下面四个方法 get set remove withInitial(初始化方法 相当于 new ThreadLocal() )public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {map.set(this, value);} else {createMap(t, value);}}public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}return setInitialValue();}private T setInitialValue() {T value = initialValue();Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);return value;}public void remove() {ThreadLocalMap m = getMap(Thread.currentThread());if (m != null) {m.remove(this);}}

当通过 ThreadLocal 的 set 方法设置变量时,实际上是通过当前线程的ThreadLocalMap 将 ThreadLocal 与值关联起来。
当通过 ThreadLocal 的 get 方法获取变量时,实际上是通过当前线程的ThreadLocalMap 查找与之关联的值。
ThreadLocalMap 使用 ThreadLocal 的弱引用作为 key,以防止内存泄漏。当 ThreadLocal 被回收时,对应的映射关系也会被清理。

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

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

相关文章

我使用HarmonyOs Next开发了b站的首页

1.实现效果展示: 2.图标准备 我使用的是iconfont图标,下面为项目中所使用到的图标 3. 代码 (1)Index.ets: import {InfoTop} from ../component/InfoTop import {InfoCenter} from ../component/InfoCenter import…

Mxnet转Onnx 踩坑记录

0. 前言 使用将MXNET模型转换为ONNX的过程中有很多算子不兼容,在此对那些不兼容的算子替换。在此之前需要安装mxnet分支v1.x版本作为mx2onnx的工具,git地址如下: mxnet/python/mxnet/onnx at v1.x apache/mxnet GitHub 同时还参考了如下…

【postgresql】 基础知识学习

PostgreSQL是一个高度可扩展的开源对象关系型数据库管理系统(ORDBMS),它以其强大的功能、灵活性和可靠性而闻名。 官网地址:https://www.postgresql.org/ 中文社区:文档目录/Document Index: 世界上功能最强大的开源…

PHP期末复习题

一、选择题 1.在下面( A )文件夹里面能找到Apache服务器的配置文件。 A.conf B. bin C.error D. data 2.取余数运算符的符号是( B )。 A. &a…

python 高级技巧 0706

python 33个高级用法技巧 列表推导式 简化了基于现有列表创建新列表的过程。 squares [x**2 for x in range(10)] print(squares)[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]字典推导式 用简洁的方式创建字典。 square_dict {x: x**2 for x in range(10)} print(square_dict){0…

数据结构1:C++实现边长数组

数组作为线性表的一种,具有内存连续这一特点,可以通过下标访问元素,并且下标访问的时间复杂的是O(1),在数组的末尾插入和删除元素的时间复杂度同样是O(1),我们使用C实现一个简单的边长数组。 数据结构定义 class Arr…

web零碎知识2

不知道我的这个axios的包导进去没。 找一下关键词: http请求协议:就是进行交互式的格式 需要定义好 这个式一发一收短连接 而且没有记忆 这个分为三个部分 第一个式请求行,第二个就是请求头 第三个就是请求体 以get方式进行请求的失手请求…

Vatee万腾平台:智慧生活的无限可能

在科技日新月异的今天,我们的生活正被各种智能技术悄然改变。从智能家居到智慧城市,从个人健康管理到企业数字化转型,科技的力量正以前所未有的速度渗透到我们生活的每一个角落。而在这场智能革命的浪潮中,Vatee万腾平台以其卓越的…

JavaWeb学习------Servlet

目录 request用法response用法sessionServletContext对象 request用法 -常用方法 String uname request.getParameter(); String[] hobbys request.getParameter("hobby");if(hobby ! null && hobby.length > 0) {for ( String hobby : hobbys) {Syst…

Swagger php注解常用语法梳理

Swagger php注解常用语法梳理 快速编写你的 RESTFUL API 接口文档工具,通过注释定义接口和模型,可以和代码文件放置一起,也可以单独文件存放。 Swagger 优势 通过代码注解定义文档,更容易保持代码文档的一致性模型复用&#xff0…

K8S集群应用国产信创适配实战经验总结

1.信创适配背景 信创国产化是在当前全球化和科技快速发展的背景下提出的。随着信息技术的快速发展,国内对科技产品和服务的需求日益增长,同时,国际局势的动荡和贸易环境的变化也凸显了自主可控和国产化的重要性。此外,国内政策对数…

C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例

C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例 文章目录 C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例1、概述2、实现效果3、主要代码4、源码地址 更多精彩内容👉个人内容分类汇总 👈👉GIS开发 👈 1、概述 支持多线程加…

【十三】图解 Spring 核心数据结构:BeanDefinition 其二

图解 Spring 核心数据结构:BeanDefinition 其二 概述 前面写过一篇相关文章作为开篇介绍了一下BeanDefinition,本篇将深入细节来向读者展示BeanDefinition的设计,让我们一起来揭开日常开发中使用的bean的神秘面纱,深入细节透彻理解…

什么是设计模式以及常见的例子(如单例、工厂、观察者等)

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的主要目的是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。设计模式一般包含模式名称、问题、目的、解决方案、效果等基本要…

第9章 项目总结01:项目流程,每个模块的介绍

1 请介绍一下你的项目 学成在线项目是一个B2B2C的在线教育平台,本项目包括了用户端、机构端、运营端。 核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。 下图是项目的功能模块图: 项目采用前后端分离的技…

去除gif动图背景的工具网站

选择视频或GIF - 取消屏幕 (unscreen.com)https://www.unscreen.com/upload

24-7-6-读书笔记(八)-《蒙田随笔集》[法]蒙田 [译]潘丽珍

文章目录 《蒙田随笔集》阅读笔记记录总结 《蒙田随笔集》 《蒙田随笔集》蒙田(1533-1592),是个大神人,这本书就是250页的样子,但是却看了好长好长时间,体会还是挺深的,但看的也是不大仔细&…

【TORCH】绘制权重分布直方图,权重torch.fmod对torch.normal生成的随机数进行取模运算

要绘制上述代码中权重初始化的分布,可以分别展示每一层初始化权重的直方图。我们将用 torch.fmod 对 torch.normal 生成的随机数进行取模运算,确保权重值在 -2 到 2 之间。 含义解释 torch.normal(0, init_sd, size...):生成服从均值为 0、…

以黑盒与白盒的角度分析和通关xss-labs(XSS漏洞类型与总结)

目录 目录 前言 XSS漏洞的总结和梳理 1.第一关(基础palyload) 黑盒测试 白盒测试 2.第二关(闭合) 黑盒测试 白盒测试 3.第三关(字符转义) 黑盒测试 白盒测试 4.第四关(字符过滤或替换) 黑盒测试 白盒测试 5.第五关(关键词替换) 黑盒测试 白盒测试 6.第六关(…

CSS:选择器 / 14种类型

理解css选择器 CSS选择器是CSS(层叠样式表)中的关键部分,它允许开发者指定哪些HTML元素应该被应用一组特定的样式规则。选择器可以非常具体,只针对一个元素,也可以相当宽泛,影响多个元素。理解CSS选择器对…