系列五、为什么不用线程id作为ThreadLocalMap的key

2023-11-22 11:44

本文主要是介绍系列五、为什么不用线程id作为ThreadLocalMap的key,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、为什么不用线程id作为ThreadLocalMap的key

1.1、案例代码

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/21 11:50* @Description: 需求:*                  如果当前线程是线程1,那么设置书名和作者分别为 三国演义 罗贯中*                  如果当前线程是线程2,那么设置书名和作者分别为 西游记 吴承恩*                  如果当前线程是线程3,那么设置书名和作者分别为 水浒传 施耐庵*                  如果当前线程是线程4,那么设置书名和作者分别为 红楼梦 曹雪芹*                  其他线程,那么设置书名和作者分别为 朝花夕拾 鲁迅*                  * 在多线程并发的场景下,每个线程中的变量都是互相独立的*      线程A:    设置(变量1)     获取(变量1)*      线程B:    设置(变量2)     获取(变量2)* * ThreadLocal:*      1、set():将变量绑定到当前线程中*      2、get():获取当前线程绑定的变量*/
public class SetAndGetThreadVariableDemo4MainApp {/*** 书名*/private String name;/*** 作者*/private String author;private ThreadLocal<String> threadLocal1 = new ThreadLocal<>();private ThreadLocal<String> threadLocal2 = new ThreadLocal<>();public String getName() {return threadLocal1.get();}public void setName(String name) {threadLocal1.set(name);}public String getAuthor() {return threadLocal2.get();}public void setAuthor(String author) {threadLocal2.set(author);}public static void main(String[] args) {SetAndGetThreadVariableDemo4MainApp app = new SetAndGetThreadVariableDemo4MainApp();for (int i = 1; i <= 10; i++) {new Thread(() -> {try {switch (Thread.currentThread().getName()) {case "线程1":app.setName("三国演义");app.setAuthor("罗贯中");break;case "线程2":app.setName("西游记");app.setAuthor("吴承恩");break;case "线程3":app.setName("水浒传");app.setAuthor("施耐庵");break;case "线程4":app.setName("红楼梦");app.setAuthor("曹雪芹");break;default:app.setName("朝花夕拾");app.setAuthor("鲁迅");break;}System.out.println("================================");System.out.println("当前线程:" + Thread.currentThread().getName() + ",线程id:" + Thread.currentThread().getId() + "===>书名:" + app.getName() + ",作者:" + app.getAuthor());} catch (Exception e) {e.printStackTrace();}}, "线程" + i).start();}}}

1.2、原因

        如上案例所示,当一个资源类中有2个或者多个共享变量,即有多个ThreadLocal<T>时,如果使用线程id作为ThreadLocalMap的key,由于id是唯一的,往map里面put值时,相同的id,后边的值会把前边的值覆盖掉,即作者会把书名覆盖掉,那么我们再从ThreadLocalMap中取值的时候就取不到书名信息了,因此使用线程id作为ThreadLocalMap的key是不合适的。

这篇关于系列五、为什么不用线程id作为ThreadLocalMap的key的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/409910

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

git ssh key相关

step1、进入.ssh文件夹   (windows下 下载git客户端)   cd ~/.ssh(windows mkdir ~/.ssh) step2、配置name和email git config --global user.name "你的名称"git config --global user.email "你的邮箱" step3、生成key ssh-keygen

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客