当前位置: 首页 > news >正文

【JavaWeb学习笔记】17 - ThreadLocal

项目代码

https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/threadlocal/src/com/yinhai/thread

目录

项目代码

一、什么是ThreadLocal?

二、ThreadLocal快速入门

三、源码解读


一、什么是ThreadLocal?

1. ThreadLocal的作用,可以实现在同一个线程数据共享从而解决多线程数据安全问题

2. ThreadLocal可以给当前线程关联一个数据(普通变量、对象、数组)set方法

3. ThreadLocal可以像Map一样存取数据,key为当前线程, get方法

4.每一个ThreadLocal对象,只能为当前线程关联一个数据, 如果要为当前线程关联多个数据,就需要使用多个ThreadLocal对象实例

5.每个ThreadLocal对象实例定义的时候,一般为 static类型

6. ThreadLocal中保存数据,在线程销毁后,会自动释放

二、ThreadLocal快速入门

T1类 

package com.yinhai.thread;import com.sun.javafx.tk.Toolkit;/*** @author 银小海* @version 1.0* @email yinhai14@qq.com*/
public class T1 {//创建ThreadLocal对象 做成staticpublic static ThreadLocal<Object> threadLocal1 = new ThreadLocal<>();//Task是线程类 是内部类public static class Task implements Runnable{@Overridepublic void run() {Dog dog = new Dog();Pig pig = new Pig();//给threadLocal1对象放入set dogSystem.out.println("t1 task 放入这只狗" + dog);threadLocal1.set(dog);//放到这个线程里 就跟这个线程相关的System.out.println("在T1内的Task内部类run 方法中的线程=" + Thread.currentThread().getName());new T1Service().update();}}public static void main(String[] args) {new Thread((new Task())).start();}
}

T1Service类 

package com.yinhai.thread;/*** @author 银小海* @version 1.0* @email yinhai14@qq.com*/
public class T1Service {public void update(){Object o = T1.threadLocal1.get();System.out.println("T1Service取出了线程关联的对象" + o);//获取当前线程名字String name = Thread.currentThread().getName();System.out.println("在T1Service的update()线程是" + name);//调用T2DAO的update方法new T2DAO().update();}
}

 T2DAO类

package com.yinhai.thread;/*** @author 银小海* @version 1.0* @email yinhai14@qq.com*/
public class T2DAO {public void update(){Object o = T1.threadLocal1.get();System.out.println("T2DAO取出了线程关联的对象" + o);//获取当前线程名字String name = Thread.currentThread().getName();System.out.println("在T2DAO的update()线程是" + name);}
}

三、源码解读

这个线程管理多个ThreadLocal

package com.yinhai.thread;import com.sun.javafx.tk.Toolkit;/*** @author 银小海* @version 1.0* @email yinhai14@qq.com*/
public class T1 {//创建ThreadLocal对象 做成staticpublic static ThreadLocal<Object> threadLocal1 = new ThreadLocal<>();//Task是线程类 是内部类public static class Task implements Runnable{@Overridepublic void run() {Dog dog = new Dog();Pig pig = new Pig();//给threadLocal1对象放入set dogSystem.out.println("t1 task 放入这只狗" + dog);/*public void set(T value) {//1. 获取当前线程, 关联到当前线程!Thread t = Thread.currentThread();//2. 通过线程对象, 获取到ThreadLocalMap//这个线程管理多个ThreadLocal//   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);elsecreateMap(t, value);}*/threadLocal1.set(dog);//放到这个线程里 就跟这个线程相关的System.out.println("在T1内的Task内部类run 方法中的线程=" + Thread.currentThread().getName());new T1Service().update();}}public static void main(String[] args) {new Thread((new Task())).start();}
}

 get方法

package com.yinhai.thread;/*** @author 银小海* @version 1.0* @email yinhai14@qq.com*/
public class T1Service {public void update(){Object o = T1.threadLocal1.get();/** 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();*     }**/System.out.println("T1Service取出了线程关联的对象" + o);//获取当前线程名字String name = Thread.currentThread().getName();System.out.println("在T1Service的update()线程是" + name);//调用T2DAO的update方法new T2DAO().update();}
}

相关文章:

【JavaWeb学习笔记】17 - ThreadLocal

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/threadlocal/src/com/yinhai/thread 目录 项目代码 一、什么是ThreadLocal? 二、ThreadLocal快速入门 三、源码解读 一、什么是ThreadLocal? 1. ThreadLocal的作用&#xff0c;可以实现在同一个线…...

【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】

文章目录 Cortex-M33 SAU 介绍SAU 的主要功能包括SAU 寄存器配置示例 Cortex-M33 SAU 介绍 在 ARMv8-M 架构中&#xff0c;SAU&#xff08;Security Attribution Unit&#xff09;是安全属性单元&#xff0c;用于配置和管理内存区域的安全属性。SAU 是 ARM TrustZone 技术的一…...

sklearn 逻辑回归Demo

逻辑回归案例 假设表示 基于上述情况&#xff0c;要使分类器的输出在[0,1]之间&#xff0c;可以采用假设表示的方法。 设 h θ ( x ) g ( θ T x ) h_θ (x)g(θ^T x) hθ​(x)g(θTx)&#xff0c; 其中 g ( z ) 1 ( 1 e − z ) g(z)\frac{1}{(1e^{−z} )} g(z)(1e−z)1​…...

什么是众创空间?他有什么特点?

众创空间&#xff0c;是一种为大众创新创业提供专业化服务的创业服务平台&#xff0c;是顺应网络时代创新创业特点和需求&#xff0c;通过市场化机制、专业化服务和资本化途径构建的低成本、便利化、全要素、开放式的新型创业服务平台的统称。众创空间包括创客空间、联合办公空…...

什么是数据分析思维

参考 一文学会如何做电商数据分析&#xff08;附运营分析指标框架&#xff09; 电子商务该如何做数据分析&#xff1f;如何数据分析入门&#xff08;从各项指标表象进入&#xff09; https://www.processon.com/outline/6589838c3129f1550cc69950 数据分析步骤 什么是数据分析…...

利用Milvus Cloud和LangChain构建机器人:一种引人入胜且通俗易懂的方法

一、引言 机器人已经深入我们的日常生活&#xff0c;从家庭服务到工业生产&#xff0c;再到医疗和运输等领域。然而&#xff0c;这些机器人往往需要复杂的算法和数据处理技术才能有效地执行任务。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#…...

数据结构-如何实现一个队列?逐步解析与代码示例(超详细)

文章目录 前言1.队列的基本概念2.链表与数组实现队列的区别2.1数据存储结构2.2性能2.3内存使用 3.为什么选择链表实现队列&#xff1f;4.结构定义函数声明 5.核心操作5.1初始化 (QInit)5.2销毁 (QDestroy)5.3入队 (QPush)5.4出队 (QPop) 6.队列的查询操作6.1队首元素 (QueueFro…...

爬虫工作量由小到大的思维转变---<第二十三章 Scrapy开始很快,越来越慢(医病篇)>

诊断篇https://blog.csdn.net/m0_56758840/article/details/135170994?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170333243316800180644102%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id1703332433168001806441…...

.Net7.0 或更高版本 System.Drawing.Common 上传图片跨平台方案

项目升级.Net7.0以后&#xff0c;System.Drawing.Common开关已经被删除&#xff0c;且System.Drawing.Common仅在 Windows 上支持 &#xff0c;于是想办法将原来上传图片验证文件名和获取图片扩展名方法替换一下&#xff0c;便开始搜索相关解决方案。 .Net6.0文档&#xff1a;…...

【MySQL】InnoDB和MyISAM区别

文章目录 一、索引不同1 InnoDB聚簇索引&#xff0c;MyISAM非聚簇索引1 InnoDB聚簇索引2 MyISAM非聚簇索引 2 InnoDB必须要有主键&#xff0c;MyISAM允许没有主键3 InnoDB支持外键4 InnoDB不支持全文索引5 索引保存位置不同 二、对事物的支持三、存储结构不同四、存储空间不同五…...

3分钟了解安全数据交换系统有什么用!

企业为了保护核心数据安全&#xff0c;都会采取一些措施&#xff0c;比如做网络隔离划分&#xff0c;分成了不同的安全级别网络&#xff0c;或者安全域&#xff0c;接下来就是需要建设跨网络、跨安全域的安全数据交换系统&#xff0c;将安全保障与数据交换功能有机整合在一起&a…...

记录汇川:MODBUS TCP-梯形图

H5U的MODBUS通信不需要编写程序&#xff0c;通过组态MODBUS通信配置表&#xff0c;实现数据通信。 Modbus-TCP 主站即Modbus-TCP客户端&#xff0c;通过Modbus-TCP配置&#xff0c;可最多支持同时与31个 Modbus-TCP服务器&#xff08;从站&#xff09;进行通讯。 …...

electron + sqlite3 解决打包后无法写入数据库

前言 window环境。 electron28.0.0 sqlite35.1.6 使用 electron-builder 打包。 本文旨在解决打包后无法写入数据库的问题。 但如果你是打包后无法访问sqlite&#xff0c;且有报错弹窗&#xff0c;不妨也看看本文。 也许是同一种原因。 错误原因分析 打包后无法创建db文件&…...

【uniapp小程序-生成二维码+多个图片文字合并一张图】

<!-- 二维码 --><canvas id"qrcode" canvas-id"qrcode" width"120" ></canvas><!-- 生成带小程序码的分享图片 --><canvas canvas-id"shareCanvas" class"share-canvas"></canvas>#qrc…...

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践

本文内容主要基于以下开源项目探索实践&#xff0c; Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub&#xff1a;GitHub - eosphoros-ai…...

深度学习 | 基本循环神经网络

1、序列建模 1.1、序列数据 序列数据 —— 时间 不同时间上收集到的数据&#xff0c;描述现象随时间变化的情况。 序列数据 —— 文本 由一串有序的文本组成的序列&#xff0c;需要进行分词。 序列数据 —— 图像 有序图像组成的序列&#xff0c;后一帧图像可能会受前一帧的影响…...

VSCode 加Cortex-Debug嵌入式调试方法

简介 当使用ARM Cortex-M微控制器时&#xff0c;Cortex-Debug是一个Visual Studio Code的扩展&#xff0c;以简化调试过程。本文档介绍了如何编写启动配置(launch.json)。 settings.json配置 打开VSCode用户设置文件settings.json: 文件→偏好→设置选择用户设置: 在搜索栏中…...

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端&#xff0c;可以私有化部署: etcd-workbench 开源地址&#xff1a;https://github.com/tzfun/etcd-workbench Gitee地址&#xff1a;https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…...

华为ipv6配置之ospf案例

R1 ipv6 ospfv3 1 router-id 1.1.1.1 //必须要手动配置ospf id&#xff0c;它不会自动生成 interface GigabitEthernet0/0/0 ipv6 enable ipv6 address 2000::2/96 ospfv3 1 area 0.0.0.0 interface LoopBack0 ipv6 enable ipv6 address 2001::1/96 ospfv3 1 area 0.0.0.0 R2…...

Design patterns--装饰模式

设计模式之装饰模式 使用装饰模式来封装Nmea0183语句。 代码 #ifndef DATAPARSER_H #define DATAPARSER_H#include <string> #include <vector>class DataParser { public:DataParser();virtual std::string fieldAnalysis(std::vector<std::string> vecSt…...

南京大学发布“视频侦探“系统:让AI像侦探一样从长视频中找线索

这项由南京大学与中科院自动化所联合进行的研究发表于2026年的计算机视觉与模式识别(CVPR)会议&#xff0c;论文编号为arXiv:2603.22285。有兴趣深入了解的读者可以通过该编号查询完整论文内容。当我们观看一部两小时的电影时&#xff0c;想要回答"主角在什么时候第一次露…...

别再只改默认密码了!Nacos 1.x/2.x 生产环境安全加固保姆级清单(附漏洞自查脚本)

Nacos生产环境安全加固全指南&#xff1a;从基础配置到漏洞防御 在微服务架构盛行的今天&#xff0c;Nacos作为服务发现和配置管理的核心组件&#xff0c;其安全性直接影响整个系统的稳定性。许多团队在部署Nacos时往往只满足于修改默认密码&#xff0c;却忽视了完整的安全防护…...

Intv_AI_MK11嵌入式开发实战:在WSL2中部署AI模型并集成Keil5

Intv_AI_MK11嵌入式开发实战&#xff1a;在WSL2中部署AI模型并集成Keil5 1. 为什么选择WSL2进行嵌入式AI开发 对于嵌入式开发者来说&#xff0c;传统AI模型开发面临一个典型困境&#xff1a;训练环境通常基于Linux系统&#xff0c;而嵌入式开发工具链&#xff08;如Keil MDK&…...

Zephyr与MCUBoot的深度整合:从构建到安全启动的完整指南

1. 为什么需要安全启动&#xff1f; 在嵌入式开发中&#xff0c;设备固件的安全性往往是最容易被忽视的一环。想象一下&#xff0c;如果你的智能门锁固件被恶意篡改&#xff0c;或者医疗设备的程序被非法替换&#xff0c;后果会有多严重&#xff1f;这就是为什么我们需要MCUBoo…...

GRPO实战:如何用多个reward function优化你的RL模型?(附完整代码示例)

GRPO实战&#xff1a;多奖励函数融合策略与代码实现指南 强化学习模型的效果很大程度上取决于奖励函数的设计。单一奖励函数往往难以全面评估复杂任务&#xff0c;而多奖励函数融合策略能更精准地引导模型学习。本文将深入探讨GRPO框架中多奖励函数的实战应用&#xff0c;从原理…...

终极英雄联盟工具集:3大核心功能让你轻松掌控游戏全局

终极英雄联盟工具集&#xff1a;3大核心功能让你轻松掌控游戏全局 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit…...

芯片研发的残酷真相:流片成功只是开始

芯片成功"点亮"那一刻&#xff0c;项目算完成了吗&#xff1f;如果你认为算&#xff0c;那大概率还没经历过真正的芯片项目后期。事实是&#xff0c;点亮和demo跑通&#xff0c;只不过是拿到了入场券而已。真正的战斗&#xff0c;从客户拿到样片那一刻才开始。很多工…...

HiOmics平台:零代码实现ChIP-Seq数据可视化与深度解析

1. 为什么科研人员需要零代码ChIP-Seq分析工具 做表观遗传学研究的朋友们应该都深有体会&#xff0c;ChIP-Seq数据分析就像一场马拉松——从原始数据清洗、序列比对、peak calling到功能注释&#xff0c;每个环节都需要不同的工具和脚本。我刚开始接触这个领域时&#xff0c;光…...

从单张图片到动态世界:Depth-Anything-3如何重塑3D视觉的通用法则

1. 当单张图片学会"思考"深度 第一次看到Depth-Anything-3&#xff08;DA3&#xff09;处理一张普通照片时&#xff0c;我盯着屏幕足足愣了三分钟。它就像给二维世界突然装上了Z轴——原本平淡无奇的街景照片&#xff0c;在DA3的解构下&#xff0c;近处的咖啡杯轮廓清…...

4个维度解析Steam Achievement Manager:开源工具如何重塑游戏成就管理体验

4个维度解析Steam Achievement Manager&#xff1a;开源工具如何重塑游戏成就管理体验 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 一、困境诊断&#…...