多线程场景下利用ThreadLocal是线程安全?

文章目录

  • 背景
  • 多线程场景测试代码
  • 结论

背景

ThreadLocal原理以及基本概念这里我就不介绍了,这里我们主要关注ThreadLocal是否是线程安全吗?其实如果我们知道ThreadLocal原理我们肯定知道它是线程安全的,但是我在开发的时候不放心做了个测试,也顺便把测试demo贴一下

多线程场景测试代码

多线程测试代码:

package net.dreamzuora.utils;import java.util.UUID;
import java.util.concurrent.*;public class ThreadLocalMultiThread {ThreadLocal<String> threadLocal = new ThreadLocal<>();public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(1);ThreadPoolExecutor.CallerRunsPolicy callerRunsPolicy = new ThreadPoolExecutor.CallerRunsPolicy();ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200), new MyThreadFactory(), callerRunsPolicy);ThreadLocalMultiThread threadLocalMultiThread = new ThreadLocalMultiThread();for (int k =0; k < 500; k++){threadPoolExecutor.execute(threadLocalMultiThread.new TestWorker());}countDownLatch.await();}class TestWorker implements Runnable{@Overridepublic void run() {try {String s = UUID.randomUUID().toString();System.out.println(System.currentTimeMillis() + " " + Thread.currentThread().getName() + " producer : " + s);threadLocal.set(s);TimeUnit.SECONDS.sleep(1);System.out.println(System.currentTimeMillis() + " " + Thread.currentThread().getName() +  "consumer : " + threadLocal.get());threadLocal.remove();} catch (InterruptedException e) {e.printStackTrace();}}}static int i = 0;static class MyThreadFactory implements ThreadFactory{@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "my thread-" + i++);}}}

输出结果:

在这里插入图片描述

结论

最终可以发现在用一个线程中生产和消费他们的UUID始终是一致的,因而可以通过测试案例证明他们是线程安全的,可以放心使用啦

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

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

相关文章

记录一次服务进程强行退出的问题排查过程

场景&#xff1a;我这边从Hbase跑一亿多的全量数据录入Elasticsearch中&#xff0c;跑了四个多小时&#xff0c;程序突然挂掉了&#xff0c;然后我就纳闷了&#xff0c;为啥突然挂掉了&#xff1f;&#xff1f;&#xff1f; 思路1:是不是Java 进程抛出OOM异常&#xff1f; 分析…

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK

文章目录问题背景&#xff1a;问题排查过程拓展问题背景&#xff1a; 运行环境&#xff1a;Mac For IDEA 我的Mac 更新最新系统(window解决办法也是如下)后&#xff0c;由于新系统的Mac会带JDK导致自动更新Java版本&#xff0c;最后导致我在Idea控制台中执行mvn install后抛出…

ElasticSearch聚合查询

文章目录聚合分组求和平均值分析每种颜色下每种品牌的平均价格更多的metric学习Cardinality(唯一值)查询聚合分析查询聚合全局聚合 深入聚合数据分析_global bucket&#xff1a;单个品牌与所有品牌销量对比过滤聚合&#xff1a;统计价格大于1200的电视平均价格统计最近一个月的…

深入剖析线程池基本原理以及常见面试题详解

文章目录面试官&#xff1a;能给我讲讲线程池的实现原理&#xff1f;线程池类继承关系ThreadPoolExecutor核心数据结构面试官&#xff1a;给我讲讲线程池的有哪些参数&#xff1f;面试官&#xff1a;如何优雅的关闭线程&#xff1f;线程的生命周期面试官&#xff1a;线程池哪五…

设计模式七大设计原则

文章目录设计模式七大设计原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则-最少知道原则单一职责原则合成复用原则设计模式 面向对象的三个基本特征&#xff1a; 继承封装多态 设计模式体现了代码的耦合性、内聚性、可维护性、可扩展性、重用性、灵活性。 代码…

从框架源码中学习创建型设计模式

文章目录从框架源码中解读创建型设计模式工厂模式案例一&#xff1a;RocketMQ源码-创建Producer生产者案例二&#xff1a;RocketMQ源码-创建过滤器工厂抽象工厂案例一&#xff1a;Dubbo源码-创建缓存的抽象工厂案例二&#xff1a;RocketMQ源码-创建日志对象的抽象工厂单例模式面…

从框架源码中学习结构型设计模式

文章目录从框架源码学习结构型设计模式适配器模式应用实例案例一&#xff1a;dubbo框架日志适配器Logger接口日志实现类Logger适配器接口LoggerAdapter实现类Logger日志工厂桥接模式应用场景案例&#xff1a;dubbo源码-远程调用模块channelHandler设计ChannelHandler是一个SPI拓…

MDC日志logback整合使用

MDC日志logback整合使用 为什么使用MDC记录日志&#xff1f; 场景&#xff1a; 由于我的搜索服务并发量比较高&#xff0c;而处理一次搜索请求需要记录多个日志&#xff0c;因此日志特别多的情况下去查一次搜索整个日志打印情况会比较复杂。 解决方案&#xff1a; 可以使用用…

如何合理的配置线程数?

文章目录题记Java并发编程实战美团技术团队追求参数设置合理性线程池参数动态化题记 我想不管是在面试中、还是工作中&#xff0c;我们总会面临这种问题&#xff0c;那么到底有没有一种计算公式去告诉我们如何去配置呢&#xff1f; 答案是&#xff1a;没有 想要合理的配置线…

基于CompletableFuture并发任务编排实现

文章目录并发任务编排实现不带返回值/参数传递任务串行执行并行执行并行执行-自定义线程池阻塞等待&#xff1a;多并行任务执行完再执行任意一个任务并发执行完就执行下个任务串并行任务依赖场景带返回值/参数传递任务带返回值实现串行执行多线程任务串行执行对任务并行执行&am…

搜索研发工程师需要掌握的一些技能

文章目录基础语言数据结构与算法工程方面搜索相关搜索主要模块电商搜索流程分词相关搜索召回相似度算法相关词推荐排序相关国美搜索搜索算法工程师需要掌握的技能基础 语言 大部分公司用的是Solr、ElasticSearch&#xff0c;都是基于Java实现的&#xff0c;因此熟悉掌握Java语…

Flink入门看完这篇文章就够了

文章目录第一章&#xff1a;概述第一节&#xff1a;什么是Flink&#xff1f;第二节&#xff1a;Flink特点&#xff1f;第三节&#xff1a;Flink应用场景&#xff1f;第四节&#xff1a;Flink核心组成第五节&#xff1a;Flink处理模型&#xff1a;流处理和批处理第六节&#xff…

管理实践-教练技术的应用

文章目录简介课程学习的工具总结深度倾听3R原则倾听地图&#xff1a;开放式提问层次提问和SMART提问框架BIA积极性反馈GROW模型简介 最近在参加管理培训课程&#xff0c;学习《教练式指导》一课&#xff0c;现将内容总结分享一下。 课程学习的工具总结 深度倾听3R原则 工具…

spark整合MySQL

spark整合MySQL <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency>import java.sql.{Connection, DriverManager, PreparedStatement} import org…

DataFrame不同风格比较

DataFrame不同风格比较 一&#xff0c;DSL风格语法 //加载数据 val rdd1sc.textFile("/person.txt").map(x>x.split(" ")) //定义一个样例类 case class Person(id:String,name:String,age:Int) //把rdd与样例类进行关联 val personRDDrdd1.map(x>…

sparkSQL操作hiveSQL

sparkSQL操作hiveSQL <dependency><groupId>org.apache.spark</groupId><artifactId>spark-hive_2.11</artifactId><version>2.3.3</version></dependency>import org.apache.spark.sql.SparkSession//todo:利用sparksql操作h…

sparksql加载mysql表中的数据

sparksql加载mysql表中的数据 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version> </dependency>import java.util.Propertiesimport org.apache.spark.SparkCon…

sparksql保存数据常见操作

sparksql保存数据操作 import org.apache.spark.SparkConf import org.apache.spark.sql.{DataFrame, SparkSession}//todo:sparksql可以把结果数据保存到不同的外部存储介质中 object SaveResult {def main(args: Array[String]): Unit {//1、创建SparkConf对象val sparkCon…

sparksql自定义函数

sparksql中自定义函数 import org.apache.spark.sql.api.java.UDF1 import org.apache.spark.sql.types.StringType import org.apache.spark.sql.{DataFrame, SparkSession}//TODO:自定义sparksql的UDF函数 一对一的关系 object SparkSQLFunction {def main(args: Array[S…

sparksql整合hive

sparksql整合hive 步骤 1、需要把hive安装目录下的配置文件hive-site.xml拷贝到每一个spark安装目录下对应的conf文件夹中2、需要一个连接mysql驱动的jar包拷贝到spark安装目录下对应的jars文件夹中3、可以使用spark-sql脚本 后期执行sql相关的任务 启动脚本 spark-sql \ --…