系列文章目录
设计模式之避免共享的设计模式Immutability(不变性)模式
设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式
设计模式之避免共享的设计模式Copy-on-Write模式
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
一、Thread-Specific Storage是什么?
- Thread-Specific Storage(中文翻译为线程本地存储,简称TSS)模式是一种即使只有一个入口,也会在内部为每个线程分配特有的存储空间的模式。在 Java 标准类库中,ThreadLocal 类实现了该模式。
- 线程本地存储模式本质上是一种避免共享的方案,由于没有共享,所以自然也就没有并发问题。
- 如果你需要在并发场景中使用一个线程不安全的工具类,最简单的方案就是避免共享。
二、避免共享两种方案
- 将这个工具类作为局部变量使用。缺点:在高并发场景下会频繁创建对象
- 线程本地存储模式,为每个线程只需要创建一个工具类的实例,所以不存在频繁创建对象的问题。
三、应用场景
-
线程局部变量:TSS 可以用于保存线程局部变量,这在并发编程中非常有用。例如,在Web应用程序中,需要为每个Http请求创建一个独立的线程,而TSS 可以被用来存储和维护与每个请求相关的数据。
-
日志跟踪:在多线程环境中进行日志跟踪时,每个线程可以有自己的日志对象,这样可以避免日志输出混乱和线程之间的干扰。
-
上下文信息:TSS 可以用于保存线程特定的上下文信息,比如用户身份验证状态、语言偏好、或者其他与线程相关的上下文信息。
-
连接池管理:在数据库连接池等资源池管理中,TSS 可以用于为每个线程保留其拥有的数据库连接,确保数据库连接的独立性和线程安全性。
-
执行跟踪:在分布式系统或者异步处理中,TSS 可以用于存储执行上下文信息,保持线程执行跟踪的一致性。文章来源:https://www.toymoban.com/news/detail-812399.html
举个栗子
SimpleDateFormat 不是线程安全的,那如果需要在并发场景下使用它,有一个办法就是用 ThreadLocal 来解决。文章来源地址https://www.toymoban.com/news/detail-812399.html
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();
}
}
到了这里,关于设计模式之避免共享的设计模式 Thread-Specific Storage 模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!