news 2026/8/21 5:05:48

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

作者头像

张小明

前端开发工程师

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/8/21 8:41:46

leetcode 748. Shortest Completing Word 最短补全词-耗时100%

Problem: 748. Shortest Completing Word 最短补全词 解题过程 耗时100%&#xff0c;放入字符串和索引&#xff0c;然后根据长度、索引排序&#xff0c;最后统计字符数量&#xff0c;判断是否满足条件&#xff0c;满足即可返回。哈希表unordered_map速度比较慢&#xff0c;直接…

作者头像 李华
网站建设 2026/8/21 21:41:52

学Simulink——移动机器人基础驱动场景实例:基于Simulink的步进电机舵机阿克曼转向控制仿真

目录 手把手教你学Simulink——移动机器人基础驱动场景实例:基于Simulink的步进电机舵机阿克曼转向控制仿真 一、引言:让机器人“会转弯”——阿克曼转向是轮式机器人的运动灵魂 二、阿克曼转向原理与几何关系 1. 阿克曼几何模型 2. 转向指令映射 三、应用场景:小型AGV…

作者头像 李华
网站建设 2026/8/20 21:54:39

滑动窗口一题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、题目二、代码总结前言 一、题目 二、代码 第一轮找数&#xff0c;第二轮扩充 class Solution {public List<Integer> findClosestElements(int[] ar…

作者头像 李华
网站建设 2026/8/21 21:40:38

java计算机毕业设计摄影网站的设计与实现 基于SpringBoot的影像作品展示与交易平台 一站式摄影服务与照片商城系统

计算机毕业设计摄影网站的设计与实现v09879&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。从胶片到云相册&#xff0c;摄影的“暗房”早已搬到网上&#xff0c;但分散在各类社交…

作者头像 李华
网站建设 2026/8/21 17:46:53

鸿蒙5.0开发实战系列(一):黑马云音乐“猜你喜欢”列表布局实现

鸿蒙5.0开发实战系列&#xff08;一&#xff09;&#xff1a;黑马云音乐“猜你喜欢”列表布局实现 在鸿蒙5.0应用开发的学习过程中&#xff0c;页面布局是基础且核心的能力。本文将基于ArkTS技术&#xff0c;手把手带大家完成黑马云音乐“猜你喜欢”歌曲列表的布局开发&#xf…

作者头像 李华