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

Java 并发性深度解析

Java 并发性深度解析

Java 的并发体系是构建高性能、高吞吐应用的基石,从基础线程模型到 JUC 工具包,提供了完整的并发解决方案。以下是核心内容全景:


一、并发基础模型
组件说明示例
Thread基础线程单元new Thread(() -> {...}).start()
Runnable无返回值的任务接口Executor.execute(runnableTask)
Callable带返回值的任务接口Future<Integer> future = executor.submit(callableTask)
synchronized内置锁(对象锁/类锁)synchronized(lockObj) { ... }
volatile轻量级可见性保证private volatile boolean flag;

关键点

  • 每个 Java 线程对应一个 OS 线程(1:1 模型)
  • synchronized 优化历程:JDK 1.6 前重量级锁 → 偏向锁/轻量级锁(锁升级)
  • volatile 三大特性:可见性有序性禁用指令重排

二、Java 内存模型(JMM)

核心原则

读取
修改
主内存
工作内存
线程1
线程2
  1. Happens-Before 规则

    • 程序顺序规则
    • 锁规则(解锁 happens-before 加锁)
    • volatile 规则
    • 线程启动规则(thread.start() 前的修改对线程可见)
  2. 内存屏障类型

    屏障类型作用
    LoadLoad禁止读-读重排序
    StoreStore禁止写-写重排序
    LoadStore禁止读-写重排序
    StoreLoad禁止写-读重排序(全能屏障)

三、JUC 核心工具(进阶)
  1. 锁性能对比

    锁类型适用场景吞吐量
    synchronized简单同步块中等
    ReentrantLock需要高级特性(超时、公平锁)
    StampedLock读多写少极高
    ReadWriteLock读写分离
  2. 并发容器选型

    // 读多写少
    Map<String, Data> cache = new ConcurrentHashMap<>(); // 写时复制(监听器列表)
    List<Listener> listeners = new CopyOnWriteArrayList<>();// 高吞吐队列
    BlockingQueue<Log> queue = new LinkedBlockingDeque<>(1000);
    

四、线程池最佳实践

自定义线程池参数公式

int coreSize = Runtime.getRuntime().availableProcessors();
int maxSize = coreSize * 2;
int queueCapacity = 1000;new ThreadPoolExecutor(coreSize, maxSize,60L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(queueCapacity),new NamedThreadFactory("app-worker"),new CallerRunsPolicy()  // 拒绝策略:调用者运行
);

拒绝策略对比

策略行为
AbortPolicy抛 RejectedExecutionException(默认)
CallerRunsPolicy由提交任务的线程执行
DiscardOldestPolicy丢弃队列最老任务
DiscardPolicy静默丢弃新任务

五、异步编程(CompletableFuture)

链式操作示例

CompletableFuture.supplyAsync(() -> fetchOrder(), ioPool).thenApplyAsync(order -> enrichOrder(order), cpuPool).thenCombineAsync(getUserInfo(order.userId), (order, user) -> mergeData(order, user)).thenAccept(result -> sendNotification(result)).exceptionally(ex -> {log.error("Process failed", ex);return fallbackResult();});

关键操作符

  • 转换:thenApply() / thenApplyAsync()
  • 消费:thenAccept()
  • 组合:thenCompose()(扁平化嵌套 Future)
  • 并行合并:thenCombine()

六、并发陷阱与解决方案
问题现象解决方案
死锁线程相互阻塞使用 jstack 分析锁链
线程泄漏线程数持续增长监控线程池状态
CPU 100%空循环/锁竞争激烈arthas 定位热点代码
伪共享缓存行失效导致性能骤降@Contended 填充(Java 8)
上下文切换开销sys 态 CPU 占用高减少锁粒度/无锁算法

诊断工具

  • jstack:线程堆栈分析
  • jconsole:实时监控
  • VisualVM:性能剖析
  • Arthas:在线诊断神器

七、现代并发范式
  1. 响应式编程

    Flux.range(1, 100).parallel()  // 并行处理.runOn(Schedulers.parallel()).map(i -> i * 2).subscribe();
    
  2. 协程(Project Loom)

    // 虚拟线程(JDK 21+)
    Thread vThread = Thread.startVirtualThread(() -> {// 支持百万级并发
    });
    
  3. 无锁数据结构

    // 非阻塞队列
    ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
    queue.offer("data");
    

并发演进路线图

基础线程
JUC革命
ForkJoin
CompletableFuture
ZGC低延迟
虚拟线程
JDK 1.0
JDK 1.5
JDK 1.7
JDK 1.8
JDK 11
JDK 21
未来

黄金法则

  1. 优先用并发容器 → 避免手动同步
  2. 线程池资源受控 → 禁止无限创建线程
  3. 锁粒度最小化 → 减小临界区
  4. 异步优于阻塞 → CompletableFuture/Reactor
  5. 监控先行 → 生产环境接入 APM 工具(SkyWalking/Prometheus)

性能箴言

  • 无锁 > 乐观锁 > 悲观锁
  • 对象复用 > 频繁创建
  • 本地计算 > 远程调用

掌握 Java 并发性需要理解从内存模型到高级工具的完整栈,结合性能分析和现代范式,才能构建出高并发、低延迟的下一代系统。

http://www.xdnf.cn/news/16021.html

相关文章:

  • C# 基于halcon的视觉工作流-章21-点查找
  • 【前端】ikun-pptx编辑器前瞻问题一: pptx的xml样式, 使用html能100%还原么
  • 【计算机网络 篇】TCP基本认识和TCP三次握手相关问题
  • 基于springboot的医院后台管理系统的设计与实现(源码+论文)
  • 【python数据结构算法篇】python算法
  • Ubuntu 虚拟机配置 与Windows互传文件
  • 零事故网站重构:11步标准化流程与风险管理指南
  • PHICOMM(斐讯)N1盒子 - Armbian25.05(Debian 12)刷入U盘/EMMC
  • 【Spring Boot】Spring Boot循环依赖破解:@Lazy与Setter注入的取舍指南(流程图修复版)
  • Oracle RAC+ADG switchover 切换演练流程
  • 【文献笔记】ARS: Automatic Routing Solver with Large Language Models
  • LabVIEW 2025安装包| 免费免激活版下载| 附图文详细安装教程
  • Tailwind CSS快速上手 Tailwind CSS的安装、配置、使用
  • 使用qt编写上位机程序,出现串口死掉无法接受数据的bug
  • 【windows修复】解决windows10,没有【相机] 功能问题
  • 前端学习 4:一些术语集合
  • 自研能管项目开发界面
  • uniapp “requestPayment:fail [payment支付宝:62009]未知错误“
  • Gerrit多仓库对应多邮箱配置办法
  • 上下文工程的系统性优化:从组件到整合架构
  • 【ArcGIS Pro】设置临时存储文件夹(计算缓存数据存放位置)
  • 网络安全实验 番外篇 使用Web登录eNSP中防火墙
  • 【指南】网络安全领域:HW 行动(国家网络安全攻防演练)是什么?
  • opencv简介(附电子书资料)
  • 2025乐彩V8影视系统技术解析:双端原生架构与双H5免签封装实战 双端原生+双H5免签封装+TV级性能优化,一套代码打通全终端生态
  • MySql 运维性能优化
  • 为什么使用扩展坞会降低显示器的最大分辨率和刷新率
  • 数字签名(Digital Signature)
  • JVM:工具
  • A316-HF-I2S-V1:USB TO I2S HiFi音频转换器评估板技术解析