线程数据共享和安全(ThreadLocal)

news2024/9/21 14:33:36

目录

  • 介绍
  • 图解
  • 底层代码解析

ThreadLocal是一个Java中的类,用于在多线程环境下存储线程本地变量。每个线程都可以独立访问自己的ThreadLocal变量,而不会影响其他线程的变量。ThreadLocal通常用来解决多线程并发访问共享变量时的线程安全性问题。

ThreadLocal类提供了get()和set()方法来获取和设置线程本地变量的值。当一个线程访问ThreadLocal变量时,实际上是访问该线程自己的变量副本,而不是共享变量。这样可以避免线程间的竞争和冲突。

ThreadLocal在很多情况下都是一个非常有用的工具,特别是在多线程环境下需要保持线程安全性的情况下。例如,在Web应用程序中,可以使用ThreadLocal来存储用户的登录信息,以便在整个请求处理过程中都可以访问到这些信息,而不需要传递参数。

介绍

  1. ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.
  2. ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 [源码!]
  3. ThreadLocal 可以像 Map 一样存取数据,key 为当前线程, get 方法
  4. 每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数
    据,就需要使用多个 ThreadLocal 对象实例
  5. 每个 ThreadLocal 对象实例定义的时候,一般为 static 类型
  6. ThreadLocal 中保存数据,在线程销毁后,会自动释放
    在这里插入图片描述

图解

在这里插入图片描述

底层代码解析

public void set(T value) {
	   //1. 获取当前线程, 关联到当前线程!
	   Thread t = Thread.currentThread();
	   //2. 通过线程对象, 获取到ThreadLocalMap
	   //   ThreadLocalMap 类型 ThreadLocal.ThreadLocalMap
	   ThreadLocalMap map = getMap(t);
	   //3. 如果map不为null, 将数据(dog,pig..) 放入map -key:threadLocal value:存放的数据
	   //   从这个源码我们已然看出一个threadlocal只能关联一个数据,如果你set, 就会替换
	   //4. 如果map为null, 就创建一个和当前线程关联的ThreadLocalMap, 并且该数据放入
	   if (map != null)
	       map.set(this, value);
	   else
	       createMap(t, value);
}

public T get() {
       //1. 先得到当前的线程对象
      Thread t = Thread.currentThread();
       //2.通过线程获取到对应的ThrealLocalMap
       ThreadLocalMap map = getMap(t);
       if (map != null) {
            //3. 如果map不为空, 根据当前的 threadlocal对象,得到对应的Entry
           ThreadLocalMap.Entry e = map.getEntry(this);
           //4. 如果e 不为null
           if (e != null) {
               @SuppressWarnings("unchecked")
               //返回当前threadlocal关联的数据value
               T result = (T)e.value;
               return result;
           }
       }
       return setInitialValue();
}

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

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

相关文章

Git操作GitHub全记录

目录 一. GitHub ssh-key配置二. 添加GitHub仓库Git提交本地代码到Github仓库远程克隆仓库到本地的文件夹再上传本地的无.git的文件夹上传到远程仓库 三. Git删除Github仓库或某个文件或文件夹1.删除已有Github仓库2.删除Github中的某个文件或文件夹①如果没有建立本地库或者克…

OSEK任务管理

1 前言 RTOS通过任务(task)来组织应用层程序框架(framework),支持任务的并发和同步执行(concurrent and asynchronous execution of tasks),并通过调度器(scheduler&…

基于ESP32和ESP8266的物联网开发过程(一)

给大家演示一个小工具,通过Wifi去连接ESP32或者ESP8266出来的一个热点。连接到这个热点之后,可以输密码,也可以不输密码。这里我设置的是不输密码直接进来,我这个是ESP8266。 进来之后直接点配置Wifi,然后可以看到ESP8…

uniapp 禁止截屏(应用内,保护隐私)插件 Ba-ScreenShot

禁止截屏(应用内,保护隐私) Ba-ScreenShot 简介(下载地址) Ba-ScreenShot 是一款uniapp禁止应用内截屏的插件,保护隐私,支持禁止截屏、放开截屏 截图展示 也可关注博客,实时更新最…

uniapp的底部弹出层实现保姆式教程

实现照片: 此过程先进入uniapp官网,找到扩展组件 打开找到里面的uni-popup和uni-icons 点击进入,下载&安装 点击下载并导入HBuilderX 导入到你使用的目录,如test目录

4+1视图,注意区分类图与对象图

注意区分类图和对象图。对象图标记的是对象名,命名形式 对象名:类名,或者:类名。这里没有出现冒号,表示的是类图。 对象图(object diagram)。 对象图描述一组对象及它们之间的关系。对象图描述了在类图中所建立的事物实例的静态快照。和类图一…

RabbitMQ 是如何做延迟消息的 ?——Java全栈知识(15)

RabbitMQ 是如何做延迟消息的 ? 1、什么是死信? 当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter): 消费者使用 basic.reject 或 basic.nack 声明消费失败,并且消息的 reque…

(论文阅读-优化器)Selectivity Estimation using Probabilistic Models

目录 摘要 一、简介 二、单表估计 2.1 条件独立Condition Independence 2.2 贝叶斯网络Bayesian Networks 2.3 查询评估中的贝叶斯网络 三、Join选择性估计 3.1 两表Join 3.2 概率关系模型 3.3 使用PRMs的选择性估计 四、PRM构建 4.1 评分标准 4.2 参数估计 4.3 结…

9.媒体元素

视频元素 视频标签基本代码结构&#xff1a; <video src"" controls></video>其中src是视频资源的路径&#xff0c;这个路径有绝对路径和相对路径这里推荐用相对路径。&#xff08;这里可以回顾我html系列的第四篇图片标签&#xff09;&#xff0c;我们…

【数据结构】--- 深入剖析二叉树(中篇)--- 认识堆堆排序Topk

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 数据结构之旅 文章目录 &#x1f3e0; 初识堆 &#x1f4d2; 堆的概念 &#x1f4d2; 堆的性质 &#x1f3e0; 向上调整算法 && 向下调整算…

第一天学习(GPT)

1.图片和语义是如何映射的&#xff1f; **Dalle2&#xff1a;**首先会对图片和语义进行预训练&#xff0c;将二者向量存储起来&#xff0c;然后将语义的vector向量转成图片的向量&#xff0c;然后基于这个图片往回反向映射&#xff08;Diffusion&#xff09;——>根据这段描…

Junit 测试中如何对异常进行断言

本文对在 Junit 测试中如何对异常进行断言的几种方法进行说明。 使用 Junit 5 如果你使用 Junit 5 的话,你可以直接使用 assertThrows 方法来对异常进行断言。 代码如下: Exception exception = assertThrows(NumberFormatException.class, () -> {new Integer("on…

基于springboot+vue+Mysql的点餐平台网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

第四百九十二回

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SearchBar组件"相关的内容&#xff0c;本章回中将介绍SegmentedButton组件.闲话休提&#xff0c;让我们一起Talk …

引领农业新质生产力,鸿道(Intewell®)操作系统助力农业机器人创新发展

4月27日至29日&#xff0c;2024耒耜国际会议在江苏大学召开。科东软件作为特邀嘉宾出席此次盛会&#xff0c;并为江苏大学-科东软件“农业机器人操作系统”联合实验室揭牌。 校企联合实验室揭牌 在开幕式上&#xff0c;江苏大学、科东软件、上交碳中和动力研究院、遨博智能研究…

【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef

文章目录 1.数据类型&#xff1a;编译器&#xff08;compiler&#xff09;与解释器&#xff08;interpreter&#xff09;&#xff0c;中文里的汉字和标点符号是两个字节&#xff0c;不能算一个字符&#xff08;单引号&#xff09;2.运算符/循环&#xff1a;sizeof/size_t3.数组…

顶管机种类多样 国内产量不断增长

顶管机种类多样 国内产量不断增长 顶管机是一种用于非开挖管道铺设的机械设备&#xff0c;能够通过非开挖施工技术降低对地面活动的影响&#xff0c;具有工作效率高、安全性好、受地质条件限制小、环保性强等优点&#xff0c;在隧道修建、城市管网建设、地下管线敷设等场景中发…

《QT实用小工具·五十八》模仿VSCode的可任意拖拽的Tab标签组

1、概述 源码放在文章末尾 该项目实现了模仿VSCode的可任意拖拽的Tab标签组&#xff0c;包含如下功能&#xff1a; 拖拽标签页至新窗口 拖拽标签页合并控件 无限嵌套的横纵分割布局&#xff08;类似Qt Creator的编辑框&#xff09; 获取当前使用的标签组、标签页 自动向上合并…

测径仪视窗镜片的维护和保养步骤

关键字:测径仪镜片,测径仪保养,测径仪维护,视窗镜片维护,视窗镜片擦拭保养,视窗镜片的检查, 视窗镜片定期保养 视窗镜片是保护光学镜头免受污染和损伤的光学平镜片&#xff0c;它的污染和破损会直接影响光学系统的测量结果。 视窗镜片一般在受到轻微污染&#xff08;指镜片上…

项目管理-项目采购管理2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 本文承接 项目采购管理第二部分&#xff0c;详细讲解项目合同管理。 项目采购管理过程--重点&#xff1a; ①ITTO 输入&#xff0c;输出…