当前位置: 首页 > news >正文

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
http://www.jsqmd.com/news/1303003/

相关文章:

  • 计算机毕业设计之基于springboot+vue的美术展品维护管理系统
  • 实战解析:专业CPU单核稳定性测试工具CoreCycler的深度应用方案
  • 变步长NLMS算法原理与MATLAB实现
  • 从零到大师:3步实现Stable Diffusion油画风格迁移,附赠12种经典画派Prompt词库(限免24小时)
  • 上位机实践1
  • SpringBoot+Vue构建企业级考勤系统实战
  • 广州中小微企业主经济犯罪律师有哪些:【法纳刑辩】实力担当 - 晚香时候
  • 计算机毕业设计之沧州交通学院教师趣味竞赛管理系统
  • 数字签名原理与使用场景
  • 2026年永嘉县潜水打捞电话好评榜,专业快速联系电话一键收藏 - GrowUME
  • ️ 2026长沙管道疏通哪家好?5家本地正规品牌实测对比+避坑指南 - 园子一号
  • 企业GEO优化服务选型指南与衡水地区实践
  • 我们招 AI 全栈应届,不用投简历。答对这道题,直接约二面。
  • 飞书AI任务自动拆解与进度预测功能全解析,深度还原字节跳动内部SOP级协作流程
  • 三、从 0 写一个极简 Agent:工具、记忆、存储、观测
  • 2026年手机内存不够视频怎么压缩保存?亲测有效教程 - 效率工具研究所
  • 如何快速掌握图表制作:免费在线编辑器的完整教程
  • 终极指南:让2008-2017年老款Mac焕发新生,轻松安装最新macOS系统
  • Python中文分词利器jieba:从入门到实战的完整指南
  • Grok排队提示词功能解析:从原理到优化的工程实践
  • 3步掌握Stability AI生成模型:从图像到4D视频的完整实战指南
  • 表格数据AI革命:TabPFN如何用1秒解决传统机器学习难题
  • 全网首曝:某独角兽公司内部《重复劳动消除清单V3.2》(含27个已验证可迁移的AI触发规则)
  • ️ 2026北京管道疏通哪家好?5家本地正规品牌实测对比+避坑指南 - 园子一号
  • ️ 2026南京管道疏通哪家好?5家本地正规品牌实测对比+避坑指南 - 园子一号
  • 低代码平台如何优化企业业务流程开发
  • SpringBoot+Vue企业考勤系统开发与优化实践
  • 如何判断电源的质量和适配条件?
  • 通义千问回答里满是 #、** 和反引号?DS随心转先免费存 Markdown 再导出 Word - 【DS随心转】
  • 2026年7月比较好的个人IP策划拍摄供应商推荐,苏州市靠谱的个人IP策划拍摄专业团队 - 品牌推荐师