JavaWeb系列二十二: 线程数据共享和安全(ThreadLocal)

韩顺平-线程数据共享和安全ThreadLocal

  • 什么是ThreadLocal?
  • ThreadLocal环境搭建
  • ThreadLocal快速入门
  • ThreadLocal源码阅读
    • threadLocal.set()源码
    • threadLocal.get()源码

什么是ThreadLocal?

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

ThreadLocal环境搭建

现象->分析原理->看源码进一步理解

  1. 创建java项目
    在这里插入图片描述
  2. ThreadLocal类图
    在这里插入图片描述
  3. 开启线程
    在这里插入图片描述
    在这里插入图片描述

ThreadLocal快速入门

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ThreadLocal源码阅读

threadLocal.set()源码

解读set源码

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

在这里插入图片描述
在这里插入图片描述

debug1 存储
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

debug2 替换
在这里插入图片描述
在这里插入图片描述

debug3在这里插入图片描述
在这里插入图片描述

threadLocal.get()源码

解读get源码

public T get() {//1.得到当前的线程对象Thread t = Thread.currentThread();//2.得到线程的threadLocals属性, 即ThreadLocalMapThreadLocalMap map = getMap(t);if (map != null) {//3.如果线程的threadLocals不为空, 根据当前的threadLocal对象, 得到对应的EntryThreadLocalMap.Entry e = map.getEntry(this);//如果Entry不为空if (e != null) {@SuppressWarnings("unchecked")//返回当前的threadLocal关联的数据T result = (T)e.value;return result;}}return setInitialValue();
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

小阿轩yx-Haproxy搭建Web群集

小阿轩yx-Haproxy搭建Web群集 Haproxy 简介 提供高可用性 能做出标准的负载均衡 支持虚拟主机 具备健康检查能力 能用于各式各样的代理 轻量级代理环境 解决方案优势 免费 快速 可靠 特性 特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或…

前端面试题24(css3)

下面是一些常见的 CSS3 面试题,这些问题可以帮助你评估应聘者对 CSS3 的掌握程度: 1. 解释 CSS3 中的动画关键帧(keyframes)和它们是如何工作的? 回答要点:keyframes 规则用于创建动画,它可以…

后端之路——文件本地上传

一、基础原理 文件上传是一个很基础的知识点&#xff0c;尤其是本地上传&#xff0c;在现实开发基本都是云上传&#xff0c;但是作为一个基础要简单了解一下 首先前端我就不多讲解了&#xff0c;网页开发里用<form>表单可以上传文件&#xff0c;只需要加上这三属性&…

pytest系列——pytest_runtest_makereport钩子函数获取测试用例执行结果

前言 pytest测试框架提供的很多钩子函数方便我们对测试框架进行二次开发&#xff0c;可以根据自己的需求进行改造。 例如&#xff1a;钩子方法&#xff1a;pytest_runtest_makereport &#xff0c;可以更清晰的了解测试用例的执行过程&#xff0c;并获取到每个测试用例的执行…

(译文)IRIG-B对时编码快速入门

原文 PDF&#xff1a;https://ww1.microchip.com/downloads/aemDocuments/documents/FTD/tekron/tekronwhitepapers/221223-A-guide-to-IRIG-B.pdf IRIG-B3 概论 Inter-Range Instrument Group 时间码&#xff08;简称IRIG&#xff09;是一系列标准时间码格式。用于将时间信…

使用Cloudflare免费开启全站https配置SSL证书

HTTPS 我的服务器和域名是在华为云&#xff0c;华为云SSL证书巨贵&#xff0c;通过Cloudflare可以将自己的网站免费设置成https。 Cloudflare注册 访问Cloudflare, 注册账号。 添加站点 添加你自己的站点&#xff0c;选择免费的套餐。 添加DNS 添加你的域名、子域名、…

PCB阻抗控制为何如此重要?

或许你在各个厂商打PCB板的时候&#xff0c;会遇到询问你是否需要阻抗的的下单需求&#xff1f; 在当今的应用中&#xff0c;设计通常变得越来越快&#xff0c;控制布局参数比以往任何时候都更加重要。 在PCB设计和生产过程中&#xff0c;有几种方法可以进行阻抗控制。最常见的…

轻松转换!两款AI工具让word秒变ppt!

想把Word文档一键生成PPT&#xff0c;过去有一个很常见的做法&#xff1a;先在Word文档中设置标题样式&#xff0c;通过标题样式来分隔每一部分&#xff0c;之后导出为PPT&#xff0c;就能得到一份PPT的雏形&#xff0c;但这种方法无法对PPT自动进行美化&#xff0c;即得到的只…

ZGC在三色指针中的应用

ZGC基于颜色指针的并发处理算法 ZGC初始化之后&#xff0c;整个内存空间的地址视图被设置为Remapped&#xff0c;当进入标记阶段时的视图转变为Marked0&#xff08;也称为M0&#xff09;或者Marked1&#xff08;也称为M1&#xff09;&#xff0c;从标记阶段结束进入转移阶段时…

计算机学生在大学四年应是以数据结构和算法为重还是技术为重?

我给你说点比较实在的吧&#xff0c;不管你是不是计算机专业科班出身的大学生&#xff0c;不管你在不在本科大学&#xff0c;不管你的出身和背景如何&#xff0c;想要走上计算机工作岗位&#xff0c;那必须得有拿得出手的一技之长&#xff0c;这个行业是靠技术吃饭的。 刚好我有…

Kotlin算法:把一个整数向上取值为最接近的2的幂指数值

Kotlin算法&#xff1a;把一个整数向上取值为最接近的2的幂指数值 import kotlin.math.ln import kotlin.math.powfun main(args: Array<String>) {val number intArrayOf(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)number.forEach {println("$…

一.1 信息就是位+上下文

hello程序的生命周期是从一个源程序&#xff08;或者说源文件&#xff09;开始的&#xff0c;即程序员通过编辑器创建并保存的文本文件&#xff0c;文件名是hello.c。源程序实际上就是一个由0和1组成的位&#xff08;又称为比特&#xff09;序列&#xff0c;8个位被组织成一组&…

python读取指定文件夹下的图片(glob获取)

python读取指定文件夹下的图片&#xff08;glob获取&#xff09; 定义traverse_images函数&#xff0c;仅需要改变下根路径即可 glob是python中用来查找符合特定规则的文件路径名的函数 import os from glob import globdef traverse_images (folder_path):image_formats …

ESIX配置备份和恢复

ESIX虽然重装很快&#xff0c;但是原本配置就丢失了&#xff0c;在硬件不变的情况下&#xff0c;可以使用配置备份和配置恢复的方法。 1、备份配置 1.1、执行以下两条命令 vim-cmd hostsvc/firmware/sync_configvim-cmd hostsvc/firmware/backup_config如下图&#xff0c;只需…

7月6日 VueConf 技术大会即将在深圳举办

7月6日&#xff0c;VueConf 2024 即将在深圳召开&#xff0c;本次大会正值 Vue.js 十周年&#xff0c;旨在聚焦 Vue.js 社区的成员&#xff0c;分享最新的技术动态、经验以及创新实践。 本次参与 VueConf 大会的是来自全球 Vue.js 核心团队成员、行业专家及前端开发者。其中&a…

Elasticsearch:Node.js ECS 日志记录 - Winston

这是继上一篇文章 “Elasticsearch&#xff1a;Node.js ECS 日志记录 - Pino” 的续篇。我们继续上一篇文章来讲述使用 Winston 包来针对 Node.js 应用生成 ECS 向匹配的日子。此 Node.js 软件包为 winston 记录器提供了格式化程序&#xff0c;与 Elastic Common Schema (ECS) …

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f60…

SSM高校学生综合测评系统-计算机毕业设计源码16154

摘要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个BS 结构的高校学生综合测评系统,会使高校学生综合测评系统工作系统化、规范化,也会提高高校学生综合测评系统平台形象,提高管理效率。 本学生综合测评系统是针对目前高校学生…

君方智能设计平台-对象持久化技术方案

1.背景介绍 1.1序列化功能 序列化是将复杂的图形对象、数据结构或对象转换成一种可被存储、传输或分享的格式的过程。这个格式通常是二进制或文本形式&#xff0c;能够轻松地保存在文件中或通过网络发送到其他应用程序。序列化的目的是将数据持久化&#xff0c;使其在不同时间…

服务器本地部署文件服务器minio

minio类似于阿里云的OSS&#xff0c;为不方便把图、文、日志等形式的文件保存在公有云上的&#xff0c;可以在自己的服务器上部署文件服务器 看过本人前几个文章的&#xff0c;使用docker就会很快上手部署&#xff0c;直接上所有代码 #添加镜像 docker search minio docker p…