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

news2024/9/27 12:18:02

韩顺平-线程数据共享和安全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.ThreadLocalMap
   ThreadLocalMap 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属性, 即ThreadLocalMap
   ThreadLocalMap map = getMap(t);
   if (map != null) {
       //3.如果线程的threadLocals不为空, 根据当前的threadLocal对象, 得到对应的Entry
       ThreadLocalMap.Entry e = map.getEntry(this);
       //如果Entry不为空
       if (e != null) {
           @SuppressWarnings("unchecked")
           //返回当前的threadLocal关联的数据
           T result = (T)e.value;
           return result;
       }
   }
   return setInitialValue();
}

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

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

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

相关文章

一.6 存储设备形成层次结构

在处理器和一个较大的较慢的设备(例如主存)之间插入一个更小更快的存储设备(例如高速缓存)的想法已经成为一个普遍的概念。实际上,每个计算机系统重的存储设备都被组织成了一个存储器层次结构,如图1-9所示。…

楼梯导航案例

楼梯导航 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>滚动到展示区</title><link re…

Python 中将字典内容保存到 Excel 文件使用详解

概要 在数据处理和分析的过程中,经常需要将字典等数据结构保存到Excel文件中,以便于数据的存储、共享和进一步分析。Python提供了丰富的库来实现这一功能,其中最常用的是pandas和openpyxl。本文将详细介绍如何使用这些库将字典内容保存到Excel文件中,并包含具体的示例代码…

NodeJS小饰品销售管理系统-计算机毕业设计源码21597

摘 要 在当今的数字化时代&#xff0c;电子商务已经成为了商业领域中不可或缺的一部分。随着消费者对于购物体验的要求越来越高&#xff0c;一个高效、便捷、用户友好的小饰品销售管理系统显得尤为重要。 本系统旨在利用 JavaScript 技术&#xff0c;设计并实现一个功能强大的小…

Python实现动态银河系:模拟旋转的银河动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义星系类主循环 完整代码 引言 银河系的旋转动画是一个迷人且富有挑战性的项目。通过模拟星系的旋转&#xff0c;我们可以更好地理解天文学现象&#xff0c;并创造出视觉上令人惊叹的效果。在这篇博客…

计算机网络 - 万字长文

计算机网络 二、计算机网络2.1 七层模型表格2.2 通俗讲解七层模型2.3 TCP与UDP对比2.4 TCP 三次握手过程==为什么握手是三次,而不是两次或者四次?====三次握手可以携带数据吗?====TCP三次握手失败,服务端会如何处理?====什么是半连接队列?全连接====ISN(Initial Sequence…

昇思MindSpore学习入门-CELL与参数一

Cell作为神经网络构造的基础单元&#xff0c;与神经网络层(Layer)的概念相对应&#xff0c;对Tensor计算操作的抽象封装&#xff0c;能够更准确清晰地对神经网络结构进行表示。除了基础的Tensor计算流程定义外&#xff0c;神经网络层还包含了参数管理、状态管理等功能。而参数(…

【Python】已解决:(最新版selenium框架元素定位报错)NameError: name ‘By’ is not defined

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;&#xff08;最新版selenium框架元素定位报错&#xff09;NameError: name ‘By’ is not defined 一、分析问题背景 在使用Selenium进行Web自动化测试或爬虫开…

R包:‘patchwork合并多个R图的包‘

介绍 patchwork是基于gglot2的拼图包&#xff0c;它使得基于ggplot2的图形更容易拼接在同一个图层。 安装 因为作者仅仅在GitHub发布了patchwork&#xff0c;因此无法使用install.packages("patchwork")从CRAN处获取。为了获取该包&#xff0c;首先应该安装devtoo…

十进制与十六进制,和二进制的相互转变

十六进制与十进制 十六进制&#xff08;Hexadecimal&#xff09;是一种进位制&#xff0c;基数为16&#xff0c;常用于计算机科学和电子工程中。十六进制使用16个符号来表示数值&#xff1a;0-9表示0到9&#xff0c;A-F表示10到15。十六进制的每一位可以表示4位二进制数&#…

万界星空科技MES:磷酸铁锂正极新材料生产管理系统

磷酸铁锂MES通过对生产现场的数据进行实时采集、处理和监控&#xff0c;实现对生产过程的优化和控制。它可以实时监控生产设备的运行状态、物料的使用情况、产品的生产进度等信息&#xff0c;并根据这些信息对生产过程进行调整和优化。例如&#xff0c;当发现某个生产设备的故障…

电脑桌面日历记事本怎么弄 好用的桌面日历记事本

在这个数字化的时代&#xff0c;电脑已成为我们日常生活中不可或缺的伙伴。我常常在电脑上记录各种事项&#xff0c;以便随时查看和提醒自己。而我最钟爱的记事方式&#xff0c;莫过于使用桌面日历记事本。 想象一下&#xff0c;你的电脑桌面上有一个直观的日历&#xff0c;每…

【Elasticsearch】开源搜索技术的演进与选择:Elasticsearch 与 OpenSearch

开源搜索技术的演进与选择&#xff1a;Elasticsearch 与 OpenSearch 1.历史发展2.OpenSearch 与 Elasticsearch 相同点3.OpenSearch 与 Elasticsearch 不同点3.1 版本大不同3.2 许可证不同3.3 社区不同3.4 功能不同3.5 安全性不同3.6 性能不同3.7 价格不同3.8 两者可相互导入 4…

【大模型】提示工程基础学习

目录 1. 零样本提示2. 少样本提示3. 链式思考提示&#xff08;CoT&#xff09;4. 自我一致性5. 生成知识提示6. 链式提示7. 思维树&#xff08;ToT&#xff09;8. 检索增强生成&#xff08;RAG&#xff09;9. active prompt10. 自我反思&#xff08;reflexion&#xff09;11. 多…

儿童网络守护计划:如何为孩子营造一个纯净的在线空间?

青少年不想被监视&#xff0c;但他们需要受到保护&#xff0c;免受互联网危险。我们告诉您如何与您的孩子建立信任&#xff0c;同时了解他们在网上面临的挑战。 对于今天的孩子来说&#xff0c;将离线和在线朋友分开是不可能的。青少年在任何时候都与一切事物和每个人联系在一起…

2024年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人…

MFC引用C#生成的dll,将dll放置到非exe程序目录,如何操作?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【Linux进阶】vim的用法

1.什么是vi/vim? 简单来说&#xff0c;vi是老式的文本编辑器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim的官方网站&#xff08; http://www.vim.org&#xff09;自己也说vim是一…

《无所不能的JavaScript · prototype 原型链》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;欢迎多多交流。&am…

掌握Midjourney:一份全面的使用教程

Midjourney 它是一种通过人工智能生成图片的人工智能绘画工具&#xff0c;如何使用Midjourney&#xff1f;很简单&#xff0c;只要在对话框中输入imagine 命令&#xff0c;添加您需要的图像描述或关键字&#xff0c;并在发送后生成相应的艺术图片。除了其强大的生图功能外&…