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

系列文章目录

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


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


一、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 {
   
        @Override
        public 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();
    }
}

相关推荐

  1. 设计模式避免共享设计模式Copy-on-Write模式

    2024-01-13 10:28:01       43 阅读
  2. Worker-Thread设计模式

    2024-01-13 10:28:01       43 阅读
  3. 设计模式多线程分工模式---Worker Thread模式

    2024-01-13 10:28:01       41 阅读
  4. 设计模式多线程分工模式--- Thread-Per-Message模式

    2024-01-13 10:28:01       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-13 10:28:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-13 10:28:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-13 10:28:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-13 10:28:01       18 阅读

热门阅读

  1. golang学习-结构体

    2024-01-13 10:28:01       29 阅读
  2. No Feign Client for loadBalancing defined. 错误解决

    2024-01-13 10:28:01       37 阅读
  3. MYSQL学习——聚合函数

    2024-01-13 10:28:01       29 阅读
  4. 30天精通Nodejs--第十五天:Websocket

    2024-01-13 10:28:01       34 阅读
  5. 深度学习基础教程

    2024-01-13 10:28:01       28 阅读
  6. 「HDLBits题解」Module add

    2024-01-13 10:28:01       29 阅读
  7. 在Python中调用狄拉克gamma矩阵

    2024-01-13 10:28:01       29 阅读
  8. leaflet聚类——leaflet.markercluster

    2024-01-13 10:28:01       28 阅读
  9. 单链表与循环链表创建

    2024-01-13 10:28:01       37 阅读
  10. 关于人工智能的浅见

    2024-01-13 10:28:01       34 阅读
  11. Python字符串的编码和解码

    2024-01-13 10:28:01       30 阅读