news 2026/6/9 23:20:05

线程安全全景图:从共享状态到并发工具的一站式解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线程安全全景图:从共享状态到并发工具的一站式解决方案

文章目录

  • 1. 避免共享状态(无状态/不可变)
  • 2.线程封闭
  • 3. 加锁同步
        • 常用方式:
  • 4. 使用线程安全的类/容器
  • 5. 使用原子操作(CAS)
  • 6. 合理设计并发模型
  • 7. 使用高级并发工具

解决线程安全问题,核心目标是确保多个线程在并发访问共享资源时,程序的行为仍然正确、一致、可预测。可以从以下几个关键方面入手:


1. 避免共享状态(无状态/不可变)

“不共享,就安全”

  • 使用不可变对象:如StringIntegerLocalDateTime等,一旦创建无法修改。
  • 设计无状态类:不持有实例变量,或仅持有只读数据。
  • 使用局部变量:方法内部的变量天然线程私有。

✅ 优点:无需同步,性能最高,最安全。


2.线程封闭

让数据只属于一个线程

  • ThreadLocal:为每个线程提供独立副本。
privatestaticfinalThreadLocal<SimpleDateFormat>formatter=ThreadLocal.withInitial(()->newSimpleDateFormat("yyyy-MM-dd"));

注意:需防止内存泄漏(在线程池中使用后及时remove())。


3. 加锁同步

控制对共享资源的互斥访问

常用方式:
  • synchronized 关键字
publicsynchronizedvoidincrement(){count++;}// 或publicvoidmethod(){synchronized(lock){/* 临界区 */}}
  • ReentrantLock(显式锁)
privatefinalLocklock=newReentrantLock();publicvoiddoSomething(){lock.lock();try{/* 临界区 */}finally{lock.unlock();}}

✅ 适用场景:必须修改共享可变状态时。
⚠️ 风险:死锁、性能下降、锁粒度不当。


4. 使用线程安全的类/容器

直接使用JDK提供的并发工具

类型安全替代方案
ListCopyOnWriteArrayList,Collections.synchronizedList()
SetConcurrentHashMap.newKeySet(),CopyOnWriteArraySet
MapConcurrentHashMap
QueueConcurrentLinkedQueue,BlockingQueue实现类
计数器AtomicInteger,LongAdder
示例:
privatefinalConcurrentHashMap<String,User>userCache=newConcurrentHashMap<>();privatefinalAtomicIntegercounter=newAtomicInteger(0);

5. 使用原子操作(CAS)

无锁并发,基于硬件指令

  • java.util.concurrent.atomic包:
    • AtomicInteger,AtomicReference,AtomicStampedReference(解决 ABA 问题)
  • 适用于简单状态更新(计数、标志位、引用替换等)

✅ 优点:高性能,无阻塞。
❌ 局限:不适合复杂逻辑。


6. 合理设计并发模型

从架构层面规避竞争

  • 分段锁 / 分片(Sharding):如ConcurrentHashMap将数据分段加锁。
  • 消息队列 / Actor 模型:通过单线程处理特定任务(如 Disruptor、Akka)。
  • 写时复制(Copy-On-Write):读多写少场景(如CopyOnWriteArrayList)。
  • 避免全局状态:将共享状态拆分为线程本地或请求级上下文。

7. 使用高级并发工具

  • CountDownLatch / CyclicBarrier / Semaphore:协调线程执行。
  • CompletableFuture / ExecutorService:异步编程,避免手动管理线程。
  • StampedLock:读多写少场景的高性能读写锁(支持乐观读)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 6:00:14

leetcode 743. Network Delay Time 网络延迟时间

Problem: 743. Network Delay Time 网络延迟时间 解题过程 堆优化迪杰特斯拉版本&#xff0c;Dijkstra方案&#xff0c;找到k到其他每个node的最短时间&#xff0c;然后求出所有node的最大时间&#xff0c;最大值(每个node的最小时间) 深度优先或者广度优先都可以做&#xff0c…

作者头像 李华
网站建设 2026/6/9 19:43:34

二插堆的基本原理以及简单实现

文章目录堆&#xff08;Heap&#xff09;一、堆的基本概念1. 定义2. 特点二、二叉堆的特点二、堆的数组表示堆的相关操作创建堆的类型上浮&#xff08;Heapify Up&#xff09;下沉&#xff08;Heapify Down&#xff09;插入操作删除堆顶元素获取堆顶元素完整代码堆&#xff08;…

作者头像 李华
网站建设 2026/6/9 18:50:10

顶尖学术写作工具盘点:8款平台助你提升论文质量与规范性

工具核心特点速览 工具名称 核心优势 适用场景 数据支撑 aibiye 全流程覆盖降重优化 从开题到答辩的一站式需求 支持20万字长文逻辑连贯 aicheck 院校规范适配模板化输出 国内本硕博论文框架搭建 覆盖90%高校格式要求 秒篇 3分钟文献综述生成 紧急补文献章节 知…

作者头像 李华
网站建设 2026/6/8 23:13:34

力扣题解

目录 410.分割数组的最大值 4.寻找两个正序数组的中位数 51.N皇后 410.分割数组的最大值 这个题可以运用二分答案的算法来解题。定义一个左指针和一个右指针&#xff0c;令左指针等于数组的最大值&#xff0c;令右指针等于数组所有数之和。即最终的结果一定在他们之间。 lo…

作者头像 李华
网站建设 2026/6/6 17:48:49

毕设项目 基于大数据的K-means广告效果分析

基于大数据的K-means广告效果分析 项目运行效果&#xff1a; 毕业设计 基于大数据的K-means广告效果分析&#x1f9ff; 项目分享:见文末! 一、分析背景和目的 在大数据时代的背景下&#xff0c;广告主可以购买媒介变成直接购买用户&#xff0c;广告的精准投放对广告主、服务…

作者头像 李华
网站建设 2026/6/9 6:42:39

【计算机毕设选题推荐】基于Hadoop+Django的股市行情数据可视化分析平台 毕业设计 选题推荐 毕设选题 数据分析 机器学习

✍✍计算机毕设指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡有什么问题可以…

作者头像 李华