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

2024-01-13 06:44

本文主要是介绍设计模式之避免共享的设计模式 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();}
}

这篇关于设计模式之避免共享的设计模式 Thread-Specific Storage 模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S