news 2026/7/31 22:10:14

30 | 线程本地存储模式:没有共享,就没有伤害

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
30 | 线程本地存储模式:没有共享,就没有伤害

第三部分:并发设计模式

30 | 线程本地存储模式:没有共享,就没有伤害

文章目录

  • 第三部分:并发设计模式
    • 30 | 线程本地存储模式:没有共享,就没有伤害
      • ThreadLocal 的使用方法
      • ThreadLocal 的工作原理
      • ThreadLocal 与内存泄露
      • InheritableThreadLocal 与继承性
      • 总结
      • 课后思考
      • 课后精彩留言
  • 本人其他相关文章链接



民国年间某山东省主席参加某大学校庆演讲,在篮球场看到十来个人穿着裤衩抢一个球,观之实在不雅,于是怒斥学校的总务处长贪污,并且发话:“多买几个球,一人发一个,省得你争我抢!”小时候听到这个段子只是觉得好玩,今天再来看,却别有一番滋味。为什么呢?因为其间蕴藏着解决并发问题的一个重要方法:避免共享。

我们曾经一遍一遍又一遍地重复,多个线程同时读写同一共享变量存在并发问题。前面两篇文章我们突破的是写,没有写操作自然没有并发问题了。其实还可以突破共享变量,没有共享变量也不会有并发问题,正所谓是没有共享,就没有伤害。

那如何避免共享呢?思路其实很简单,多个人争一个球总容易出矛盾,那就每个人发一个球。对应到并发编程领域,就是每个线程都拥有自己的变量,彼此之间不共享,也就没有并发问题了。

我们在第一部分:并发理论基础 | 11 | Java线程(下):为什么局部变量是线程安全的?中提到过线程封闭,其本质上就是避免共享。你已经知道通过局部变量可以做到避免共享,那还有没有其他方法可以做到呢?有的,Java 语言提供的线程本地存储(ThreadLocal)就能够做到。下面我们先看看 ThreadLocal 到底该如何使用。

ThreadLocal 的使用方法

下面这个静态类 ThreadId 会为每个线程分配一个唯一的线程 Id,如果一个线程前后两次调用 ThreadId 的 get() 方法,两次 get() 方法的返回值是相同的。但如果是两个线程分别调用 ThreadId 的 get() 方法,那么两个线程看到的 get() 方法的返回值是不同的。若你是初次接触 ThreadLocal,可能会觉得奇怪,为什么相同线程调用 get() 方法结果就相同,而不同线程调用 get() 方法结果就不同呢?

static class ThreadId { static final AtomicLong nextId=new AtomicLong(0); //定义ThreadLocal变量 static final ThreadLocal<Long> tl=ThreadLocal.withInitial( ()->nextId.getAndIncrement()); //此方法会为每个线程分配一个唯一的Id static long get(){ return tl.get(); } }

能有这个奇怪的结果,都是 ThreadLocal 的杰作,不过在详细解释 ThreadLocal 的工作原理之前,我们再看一个实际工作中可能遇到的例子来加深一下对 ThreadLocal 的理解。你可能知道 SimpleDateFormat 不是线程安全的,那如果需要在并发场景下使用它,你该怎么办呢?

其实有一个办法就是用 ThreadLocal 来解决,下面的示例代码就是 ThreadLocal 解决方案的具体实现,这段代码与前面 ThreadId 的代码高度相似,同样地,不同线程调用 SafeDateFormat 的 get() 方法将返回不同的 SimpleDateFormat 对象实例,由于不同线程并不共享 SimpleDateFormat,所以就像局部变量一样,是线程安全的。

s
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 22:08:12

3分钟快速部署:终极自托管付费墙突破工具13ft Ladder完整指南

3分钟快速部署&#xff1a;终极自托管付费墙突破工具13ft Ladder完整指南 【免费下载链接】13ft My own custom 12ft.io replacement 项目地址: https://gitcode.com/GitHub_Trending/13/13ft 在信息获取日益受限的今天&#xff0c;付费墙已成为普通用户阅读优质内容的最…

作者头像 李华
网站建设 2026/7/31 21:59:58

让老旧Mac重获新生:OpenCore Legacy Patcher显卡修复完全指南

让老旧Mac重获新生&#xff1a;OpenCore Legacy Patcher显卡修复完全指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为苹果官方放弃支持的老旧…

作者头像 李华
网站建设 2026/7/31 21:50:23

LLaMA-Factory数据集处理指南:从JSON到高效微调数据

LLaMA-Factory数据集处理指南&#xff1a;从JSON到高效微调数据 【免费下载链接】LlamaFactory Unified Efficient Fine-Tuning of 100 LLMs & VLMs (ACL 2024) 项目地址: https://gitcode.com/GitHub_Trending/ll/LlamaFactory 在大语言模型&#xff08;LLM&#x…

作者头像 李华