设计模式之避免共享的设计模式 Thread-Specific Storage 模式

系列文章目录

设计模式之避免共享的设计模式Immutability(不变性)模式
设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式
设计模式之避免共享的设计模式Copy-on-Write模式


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 一、Thread-Specific Storage是什么?
  • 二、避免共享两种方案
  • 三、应用场景
    • 举个栗子


一、Thread-Specific Storage是什么?

  • Thread-Specific Storage(中文翻译为线程本地存储,简称TSS)模式是一种即使只有一个入口,也会在内部为每个线程分配特有的存储空间的模式。在 Java 标准类库中,ThreadLocal 类实现了该模式。
  • 线程本地存储模式本质上是一种避免共享的方案,由于没有共享,所以自然也就没有并发问题。
  • 如果你需要在并发场景中使用一个线程不安全的工具类,最简单的方案就是避免共享。

二、避免共享两种方案

  1. 将这个工具类作为局部变量使用。缺点:在高并发场景下会频繁创建对象
  2. 线程本地存储模式,为每个线程只需要创建一个工具类的实例,所以不存在频繁创建对象的问题。

三、应用场景

  1. 线程局部变量:TSS 可以用于保存线程局部变量,这在并发编程中非常有用。例如,在Web应用程序中,需要为每个Http请求创建一个独立的线程,而TSS 可以被用来存储和维护与每个请求相关的数据。

  2. 日志跟踪:在多线程环境中进行日志跟踪时,每个线程可以有自己的日志对象,这样可以避免日志输出混乱和线程之间的干扰。

  3. 上下文信息:TSS 可以用于保存线程特定的上下文信息,比如用户身份验证状态、语言偏好、或者其他与线程相关的上下文信息。

  4. 连接池管理:在数据库连接池等资源池管理中,TSS 可以用于为每个线程保留其拥有的数据库连接,确保数据库连接的独立性和线程安全性。

  5. 执行跟踪:在分布式系统或者异步处理中,TSS 可以用于存储执行上下文信息,保持线程执行跟踪的一致性。

举个栗子

SimpleDateFormat 不是线程安全的,那如果需要在并发场景下使用它,有一个办法就是用 ThreadLocal 来解决。

public class ThreadLocalSimpleDateFormatExample {// 创建一个ThreadLocal对象来存储SimpleDateFormat实例private static ThreadLocal<SimpleDateFormat> threadLocalSdf = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 格式化日期public static String formatCurrentDate() {SimpleDateFormat sdf = threadLocalSdf.get();return sdf.format(new Date());}// 线程执行的任务public static class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Formatted date: " + formatCurrentDate());}}public static void main(String[] args) throws InterruptedException {// 创建多个线程并执行任务Thread t1 = new Thread(new MyRunnable());Thread t2 = new Thread(new MyRunnable());t1.start();Thread.sleep(10000);t2.start();}
}

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

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

相关文章

Android Matrix (三)矩阵组合和应用变换

在 Android 开发中&#xff0c;Matrix 类不仅提供了 mapPoints 方法来变换点坐标&#xff0c;还提供了多种其他用法&#xff0c;使其成为处理图像和视图变换的强大工具。以下是 Matrix 类的一些关键用法&#xff1a; 1. 变换方法 setTranslate(float dx, float dy): 设置矩阵…

Android开发基础(二)

Android开发基础&#xff08;二&#xff09; 上篇主要描述了Android系统架构&#xff0c;代码是通过Java表示的&#xff1b; 本篇将从介绍Android组件去理解Android开发&#xff0c;代码将对Java和Kotlin进行对比。 Android组件 Android应用程序由一些零散的有联系的组件组成…

黑洞数(C语言)

黑洞数也称为陷阱数&#xff0c;又称“Kaprekar问题”&#xff0c;是一类具有奇特转换特性的数。 任何一个各位数字不全相同的三位数&#xff0c;经有限次“重排求差”操作&#xff0c;总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后…

element input组件自动失去焦点问题解决

最近在 Vue3 ElementPlus 中&#xff0c;使用 el-input 组件时&#xff0c;如果设置了 v-model&#xff0c;那么在每次改变内容后后&#xff0c;input 会自动失去焦点&#xff0c;这样会导致用户无法输入多个字符。 一、问题原因 如上图所示&#xff0c;配置项的 Name 和 Cod…

算法训练营Day36

#Java #动态规划 开源学习资料 Feeling and experiences&#xff1a; 动态规划&#xff1a;01背包理论基础&#xff1a;卡码网题目链接 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xf…

信息收集之子域名收集

渗透测试常见手法和思维 信息收集 简述 信息收集对于渗透测试前期来说是非常重要的&#xff0c;因为只有我们掌握了目标网站或目标主机足够多的信息之后&#xff0c;我们才能更好地对其进行漏洞检测。正所谓&#xff0c;知己知彼百战百胜&#xff01; 信息收集的方式可以分…

linux下can调试工具canutils编译安装

命令安装只需要 sudo apt-get install canutils 一、下载源码 下载canutils和libsocketcan libsocketcan地址&#xff1a;https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2 #0.0.11版本 canutils地址&#xff1a;https://public.pengutronix…

【计算机毕业设计】基于springboot的校园跑腿任务管理系统java+vue

校园跑腿管理系统又称“效率鸭”跑腿系统&#xff0c;是在学校进行现代化的信息管理和提供信息服务的基础&#xff0c;引导人们快速、准确地获取快递资源、预约洗浴并对外卖资源进行有效管理的保证。疫情当下&#xff0c;为了减少人员的聚集&#xff0c;因此&#xff0c;迫切需…

StampedLock详解

在现代的Java应用中&#xff0c;同步是一个核心问题&#xff0c;尤其是在高并发环境下。Java提供了多种同步机制&#xff0c;从基本的synchronized关键字到更高级的ReentrantLock。但在Java 8中&#xff0c;引入了一个新的同步原语——StampedLock&#xff0c;它旨在提供更高的…

C#使用Office原生库开发后的运行问题

目录 一、准备 二、测试Office2007 1、直接运行 2、安装VS2009 3、重新在“引用”库 4、安装“包” 5、报错修复 6、小结 三、测试office2010 1、在VS2019中打开原项目 2、添加“包” 3、重新添加引用 4、测试Word功能 5、测试卸掉那两个“包” 6、测试Excel功能…

索引策略-多列索引

一. 前言 当我们对多列索引的理解不够深刻的时候,往往会为每个列创建独立的索引或者按照错误的顺序创建多列索引。 二. 案例说明 问题一: 为每个列创建独立索引 CREATE TABLE t(c1 INT,c2 INT,c3 INT,KEY(c1),KEY(c2),KEY(c3) );这种索引策略,一般都是由于人们听到一些专家诸…

阳光保险选择OceanBase稳定运行超700天

阳光保险集团成立于 2005 年 7 月&#xff0c;旗下拥有财产保险、人寿保险、信用保证保险、资产管理等多家专业子公司&#xff0c;是全球市场化企业中成长最快的集团公司之一&#xff0c;目前位列中国保险行业前八。随着数字化升级趋势的不断加速&#xff0c;很多企业产生将软硬…

达摩研究院Paraformer-large模型已支持windows

简介 FunASR是一个基础语音识别工具包&#xff0c;提供多种功能&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语音端点检测&#xff08;VAD&#xff09;、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和教程&#xff0…

二十三、关于vite项目中无法使用minio的解决方案

问题背景 项目需要上传大文件,既然是大文件,如果一次性进行读取发送、接收都是不可取的,很容易导致内存问题。所以对于大文件上传,就一定要实现切片上传、断点续传。如果自己实现相对比较麻烦,但好消息是我们的文件服务使用了开源的minio作为对象存储服务,并且minio也提…

OpenGL排坑指南—贴图纹理绑定和使用

一、前言 在OpenGL学习 的纹理这一章中讲述了纹理贴图的使用方式&#xff0c;主要步骤是先创建一个纹理的对象&#xff0c;和创建顶点VAO类似&#xff0c;然后就开始绑定这个纹理&#xff0c;最后在循环中使用&#xff0c;有时候可能还要用到激活纹理单元的函数。然而&#xff…

练习-sizeof()和strlen()

目录 前言解题技巧一、sizeof()练习题1.1 整型数组1.1.1 一维整型数组1.1.2 二维整型数组 1.2 字符数组1.3 字符指针 二、strlen()练习题2.1 字符数组初始化时不包含\02.2 字符数组初始化包含\02.3 字符指针指向字符串常量 总结 前言 最近有点疲倦&#xff0c;啊啊啊&#xff…

电容的基础知识

一、电容单位 电容亦称作“电容量”&#xff0c;是指在给定电位差下的电荷储藏量&#xff0c;记为C&#xff0c;国际单位是法拉&#xff08;F&#xff09;。在国际单位制里&#xff0c;电容的单位是法拉&#xff0c;简称法&#xff0c;符号是F&#xff0c;由于法拉这个单位太大…

vue3项目部署到服务器,刚打开没事,一刷新页面就404

vue3项目部署到服务器&#xff0c;刚打开没事&#xff0c;一刷新页面就404 vue3项目&#xff0c;在本地调试时各方面都没毛病&#xff0c;刷新也没毛病&#xff0c;但是&#xff0c;扔到服务器上&#xff0c;第一次打开是正常的&#xff0c;再刷新下就404了&#xff0c;不知道什…

视频号小店入口在哪?需要什么资质?实操详解!

我是电商珠珠 视频号小店于22年7月产生&#xff0c;距今才发展了一年时间。今年正是它风口期正盛的时候&#xff0c;有很多想要入驻的新手还不知道它在哪&#xff0c;都需要什么资质。 接下来我来给大家详细的讲一下。 视频号小店入口 1、手机端 打开vx搜索“视频号开店”…

第二十章 常见的设计模式

文章目录 一、设计模式二、单例模式三、工厂模式四、抽象工厂模式五、适配器模式六、观察者模式七、代理模式八、策略模式九、MVC模式十、组合模式 一、设计模式 什么是设计模式 设计模式是一种固定的解决问题的方式是一套经过代码设计经验总结优化之后的固定的方式是软件工程…