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

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.dtcms.com/a/292347.html

相关文章:

  • JS WebAPIs DOM节点概述
  • 网络层传输
  • 4G车载录像机的作用详解:提升行车安全与智能管理的核心技术
  • 数字签名(Digital Signature)
  • XSS内容分享
  • Windows 环境排除 Windows Defender 对指定路径或进程的影响
  • 在vscode 使用 remote-ssh
  • 【接口自动化】掌握接口自动化:核心概念讲解(理论知识)
  • 微博视觉算法面试30问全景精解
  • 8.4 Java 原生 TCP Socket 实现 HTTP 请求解析和请求分发
  • OpenCV基本的图像处理
  • 本地数据库有数据,web页面无信息显示,可能是pymysql的版本问题【pymysql连接本地数据库新旧版本的区别】
  • 【测试开发】----用例篇
  • 高并发场景下的缓存问题与一致性解决方案(技术方案总结)
  • 设计模式——责任链模式
  • 建造者设计模式
  • Qt布局管理:实现美观界面的关键
  • 2025 年最新 AI 技术:全景洞察与深度解析​
  • 从 0 到 1 搞定nvidia 独显推流:硬件视频编码环境安装完整学习笔记
  • Arraylist与LinkedList区别
  • 使用react编写一个简单的井字棋游戏
  • ZLMediaKit 入门
  • 第12天 | openGauss逻辑结构:模式管理
  • Java 大视界 -- Java 大数据在智能医疗医疗设备维护与管理中的应用(358)
  • 25. K 个一组翻转链表
  • Odoo:免费开源的金属制品行业ERP管理软件
  • React 面试题库
  • 写个 flask todo app,简洁,实用
  • calibrate_hand_eye (CalibDataID, Errors)
  • 2025年远程桌面软件深度评测:ToDesk、向日葵、TeamViewer全方位对比分析