Clarence Java DocClarence Java Doc
开发总结
Java
数据库
缓存
JVM
Spring
微服务
消息队列
高并发
分布式
高可用
设计模式
场景题
Netty
云原生
算法
系统架构
开发协议
IOT
人工智能
开发总结
Java
数据库
缓存
JVM
Spring
微服务
消息队列
高并发
分布式
高可用
设计模式
场景题
Netty
云原生
算法
系统架构
开发协议
IOT
人工智能
  • Java 并发基础
  • ThreadPool
  • 高并发架构
  • 高并发指标
  • 压力测试方案
  • 性能监控工具

Java 并发基础

参考链接:

https://gitee.com/Doocs/advanced-java

实现异步的9种方式-捡田螺的小男孩

一、JUC - Atomic

Java 中的 java.util.concurrent.atomic 包提供了一组原子变量类,主要用于高并发场景下的无锁编程,比起使用 synchronized,这些类可以提升程序的性能和吞吐量。

1、核心思想

CAS(Compare-And-Swap)是实现原子操作的核心思想,其工作原理如下:

  • 比较内存中的值与预期值,如果一致,则将其更新为新的值。
  • 它是一种乐观锁机制,通过尝试修改共享数据并检查是否发生了冲突来保证线程安全。

2、常用分类

2.1. 基本类型原子类

类名对应类型
AtomicIntegerint
AtomicLonglong
AtomicBooleanboolean

示例:

private void test() {
    AtomicInteger counter = new AtomicInteger(0);
    counter.incrementAndGet();  // +1
    counter.addAndGet(5);       // +5
}

2.2 引用类型原子类

类名说明
AtomicReference<T>原子更新引用
AtomicStampedReference<T>带版本戳,解决ABA问题
AtomicMarkableReference<T>带布尔标记

ABA问题解决示例:

private void test() {
    AtomicStampedReference<Integer> ref = new AtomicStampedReference<>(1, 0);
    int[] stampHolder = new int[1];
    Integer value = ref.get(stampHolder);
    ref.compareAndSet(value, 2, stampHolder[0], stampHolder[0] + 1);
}

2.3 数组原子类

类名说明
AtomicIntegerArray原子更新整型数组
AtomicLongArray原子更新长整型数组
AtomicReferenceArray<T>原子更新引用数组

3. 高级类:LongAdder / LongAccumulator

为了解决高并发下 AtomicLong 的热点问题,引入了分段累加器:

private void test() {
    LongAdder adder = new LongAdder();
    adder.increment(); // 高并发下效率更好
}

4、优缺点对比

特点Atomic 原子类synchronized
是否阻塞否(非阻塞)是
性能高中
是否公平否是
可读性一般高

5、使用建议

  • 在并发量大但冲突概率低的场景中使用 Atomic 类。

  • 如果涉及多个变量的原子性,则需要使用 synchronized 或 Lock。

二、JUC - LOCK

synchronized

ReentrantLock

CountDownLatch / CyclicBarrier

Semaphore

BlockingQueue

ConcurrentHashMap

三、JUC - Fork/Join

Fork/Join 工作窃取算法

任务拆分与合并

四、JUC - CompletableFuture

1. CompletableFuture 简介

  • 介绍 CompletableFuture 的定义和基本用途。
  • 与 Future 的区别。

2. CompletableFuture 常用操作

  • 创建 CompletableFuture 的方式。
  • thenApply、thenAccept、thenRun 等常用方法。
  • 异常处理 (handle、exceptionally 等)。

3. 组合异步任务

  • thenCompose 和 thenCombine 的使用。
  • allOf 和 anyOf 的异步任务组合。

4. 完成和取消任务

  • 使用 complete 方法完成任务。
  • 使用 cancel 方法取消任务。

5. 相关坑和陷阱

  • 线程池管理。
  • 异常处理。
  • 阻塞与非阻塞操作。

五、JUC - 异步编程

1. 异步编程概述

  • 异步编程的基本概念。
  • 为什么需要异步编程?

2. 异步任务的设计与实现

  • 使用 ExecutorService 和 Callable 进行任务调度。
  • 如何设计高效的异步任务执行模型。

3. 异步编程的模式

  • 发布-订阅模式。
  • 生产者-消费者模式。
  • 任务链模式。

4. 异步编程的挑战与最佳实践

  • 线程管理与资源消耗。
  • 错误处理与回调机制。
  • 如何避免死锁、竞争条件等问题。
Last Updated:
Contributors: hanchen, Clarence, hello0709
Next
ThreadPool