ThreadLocal用法

ThreadLocal 用法

ThreadLocal从字面意思来说,独立线程空间的意思,所以其用法也很简单,就是当一个线程需要有自己的变量,并且这个变量不想和其他变量共享,那么就使用ThreadLocal 变量:

比如常见的我们经常使用SimpleDateFormate 这个类对 date 类型的变量做格式化操作,但是众所周知,这个类是非线程安全的,所以如果像下面这样,把这个解析操作放在util类里面,这样就会有线程安全问题:

public class DateUtils {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");public Date convertDate() throws ParseException {return sdf.parse("2023-11-05");}
} 

当 DateUitls 是单例的情况下,就会有线程安全问题,因为parse方法是非线程安全的

这里的单例就是说当这个类被spring 管理,或者说是spring的一个bean的时候,那么这个bean其实是属于主线程的,所以在主线程里创建了很多其他线程,然后在使用这个bean util的时候,会从主线程里拿到这个bean到自己的线程空间执行,一旦线程很多,那么这个就有线程安全问题

所以改成用threadLocal就可以了:

ThreadLocal<SimpleDateFormat> t = ThreadLocal.withInitial(()->{return new SimpleDateFormat("yyyy-mm-dd");});public Date convertDate() throws ParseException {return t.get().parse("2023-11-05")}

这样,每个线程独立的拥有对象 t,虽然方法是公用的,但是里面的 t 对象是线程独有的,所有就解决了冲突问题

ThreadLocal 的使用场景

有些伙伴会问了,我使用同步的方式也能解决上述问题呀,把 SimpleDateFormate 对象做同步一下就可以了

是的,使用同步可以解决问题,但是我们要看哪一种方式更合适,一般必须使用同步的场景是这个变量属于业务共享的,也就是说一个线程操作这个对象对别的线程是有业务影响的,是有业务逻辑关系的,再或者说其他线程操作这个变量要看当前线程操作的结果,比如商品库存,这个你总不能说用 ThreadLocal 去定义这个库存吧,那岂不是要疯了。。。总之,,,怎么都能理解吧,这种情况下,必须要使用同步,不能使用 ThreadLocal

而另一种情况就是刚刚那个 SimpleDateFormate 的使用场景,每个线程间操作这个对象对其他线程是否使用或者操作这个对象没有毛线影响,那可以使用 ThreadLocal 对象,还有一些场景比如 User 信息这种。。。

欢迎讨论~~

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

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

相关文章

解决一个Qt程序崩溃的问题

当Qt崩溃时&#xff0c;使用Qt Creator调试&#xff0c;也无法定位到是哪个地方除了问题。只发现日志报出一个Fatal。 Fatal: 2023-11-05 00:16:26 [io\qprocess_win.cpp:826] ASSERT: "pid" in file io\qprocess_win.cpp, line 826触发的情况&#xff0c;就是使用…

VR全景技术在文化展示与传播中有哪些应用?

引言&#xff1a; 随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术已经成为文化展示与传播领域的一项重要工具。那么VR全景技术是如何改变文化展示与传播方式&#xff0c;VR全景技术又如何推动文化的传承和普及呢&#xff1f; 一&#xff0e;VR技术…

壹[1],Opencv常用结构

1&#xff0c;Point类&#xff1a;点表示 point表示二维结构的点,(x,y) cv::Point point; point.x 100; point.y 100; 2&#xff0c;Scalar类&#xff1a;颜色表示 cv::Scalar colorBlue(255,0,0);//蓝色 cv::Scalar colorGreen(0, 255, 0);//绿色 cv::Scalar colorRed(0, …

第11章_数据处理之增删改

文章目录 1 插入数据1.1 实际问题1.2 方式 1&#xff1a;VALUES的方式添加1.3 方式2&#xff1a;将查询结果插入到表中演示代码 2 更新数据演示代码 3 删除数据演示代码 4 MySQL8新特性&#xff1a;计算列演示代码 5 综合案例课后练习 1 插入数据 1.1 实际问题 解决方式&#…

英语语音识别,语言评测,语音打分实践与代码实现

项目在这&#xff1a;couldn/speech-evaluation-of-english 详细的可查看项目内的md文档

是时候放弃 Java 序列化了

基本概念 Java 序列化和反序列化三连问&#xff1a; 什么是 Java 序列化和反序列化&#xff1f;为什么需要 Java 序列化和反序列化&#xff1f;如何实现 Java 序列化和反序列化&#xff1f; 是什么 一句话就能够说明白什么是 Java 序列化和反序列化&#xff1f;Java 序列化…

linux傻瓜式安装Java环境及中间件

linux配置Java环境及中间件 1.傻瓜式安装Java1.下载2.追加3.刷新测试 2.傻瓜式安装docker1.docker卸载2.docker安装 3.Docker傻瓜式安装Redis1.傻瓜式安装安装并配置 4.Docker傻瓜式安装RabbitMQ5.Docker傻瓜式安装MySql1.拉取2.配置 6.傻瓜式安装Nacos1.官网下载nacos2.SQL文件…

vue2.0 打包,nginx部署

1、修改这里为空 否则报错&#xff1a;vue is undefined 2、修改为hash&#xff0c;重点&#xff1a;打包dist文件运行&#xff0c;必须这样 3、安装ngnix&#xff0c;重点&#xff1a;使用node的包&#xff1a;httpserve&#xff0c;失败 4、重点&#xff1a;配置代理转发 前端…

MySQL:事务

目录 概念事务特性开始事务事务的状态事务并发问题事务隔离级别 概念 MySQL事务是一组在数据库中执行的操作&#xff0c;它们必须要么全部成功执行&#xff0c;要么全部不执行。MySQL事务被设计为确保数据库中的数据的完整性和一致性&#xff0c;即使在并发访问的情况下也是如…

MySQL进阶之性能优化与调优技巧

数据库开发-MySQL 1. 多表查询1.1 概述1.1.2 介绍1.1.3 分类 1.2 内连接1.3 外连接1.4 子查询1.4.1 介绍1.4.2 标量子查询1.4.3 列子查询1.4.4 行子查询1.4.5 表子查询 2. 事务2.1 介绍2.2 操作2.3 四大特性 3. 索引3.1 介绍3.2 结构3.3 语法 1. 多表查询 1.1 概述 1.1.2 介绍…

上线Spring boot-若依项目

基础环境 所有环境皆关闭防火墙与selinux 服务器功能主机IP主机名服务名称配置前端服务器192.168.231.177nginxnginx1C2G后端服务器代码打包192.168.231.178javajava、maven、nodejs4C8G数据库/缓存192.168.231.179dbmysql、redis2C4G Nginx #配置Nginxyum源 [rootnginx ~]…

基于葡萄串的采摘点定位方法

文章目录 概要所需设备方法基于RGB图像的YOLOV8目标检测基于深度图的区域种子生长利用峰值定位法来确定竖向位置核心代码演示效果概要 这里将介绍如何用图像识别方法来定位葡萄串采摘点,用于机器人自动采摘操作。 所需设备 深度相机,这里我用的是realsense-L515 方法 主…

Spring Boot Actuator 漏洞利用

文章目录 前言敏感信息泄露env 泄露配置信息trace 泄露用户请求信息mappings 泄露路由信息heapdump泄露堆栈信息 前言 spring对应两个版本&#xff0c;分别是Spring Boot 2.x和Spring Boot 1.x&#xff0c;因此后面漏洞利用的payload也会有所不同 敏感信息泄露 env 泄露配置信…

野火霸天虎 STM32F407 学习笔记_2 寄存器介绍

寄存器 虽然正式编程没有必要用寄存器编程&#xff0c;通常都是库函数或者 hal 库。但是还是有必要学一下原理的。 寄存器映射 芯片视图如下。 丝印&#xff1a;芯片上印的信息。型号&#xff0c;内核&#xff0c;生产批次等。 引脚&#xff1a;左上角是有小圆点的&#x…

Android性能优化--Perfetto用SQL性能分析

Android性能优化–Perfetto用SQL性能分析 文章目录 Android性能优化--Perfetto用SQL性能分析介绍Perfetto SQL 基础使用 Perfetto SQL 进行性能分析总结 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134167741 最新更新地址 https://gitee.com/chenjim/che…

力扣日记11.5-【二叉树篇】二叉树的迭代遍历

力扣日记&#xff1a;【二叉树篇】二叉树的迭代遍历 日期&#xff1a;2023.11.5 参考&#xff1a;代码随想录、力扣 144. 二叉树的前序遍历 题目描述 难度&#xff1a;简单 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 提示&#xff1a; 树中节点数目在…

Git(七).git 文件夹瘦身,GitLab 永久删除文件

目录 一、问题背景二、问题复现2.1 新建项目2.2 上传大文件2.3 上传结果 三、解决方案3.1 GitLab备份与还原1&#xff09;备份2&#xff09;还原 3.2 删除方式一&#xff1a;git filter-repo 命令【推荐】1&#xff09;安装2&#xff09;删除本地仓库文件3&#xff09;重新关联…

将 UniLinks 与 Flutter 集成(安卓 AppLinks + iOS UniversalLinks)

让我们使用 Flutter Mobile 和 Flutter Web 集成 UniLinks。 一步一步的指导&#xff01; 我是 Pedro Dionsio&#xff0c;是葡萄牙 InspireIT 公司的 Flutter 开发人员&#xff0c;我写这个 UniLinks 教程的座右铭是&#xff1a; Firebase DynamicLinks 已被弃用&#xff0…

机器学习笔记 - 感知器的数学表达

一、假设前提 感知机(或称感知器,Perceptron)是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。 它可以被视为一种最简单形式的前馈神经网络,是一种二元线性分类模型,其输入为实例的特征向量,输出为实…

206. 反转链表 --力扣 --JAVA

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 解题思路 先排除特殊情况&#xff1a;当前链表包含节点数小于等于&#xff1b;获取末尾节点&#xff0c;即反转后的头节点&#xff1b;通过递归来反转节点间的上下级关系&#xff1b;…