image.png

synchronized 中的无锁、偏向锁、轻量级锁、重量级锁

Java 中的各种锁

Java Synchronized原理

AQS AbstractQueuedSynchronizer

CopyOnWriteArrayList

Spring synchronized volatile | DCL

分布式锁设计

image.png

## 一、原子类(AtomicXXX)
- 基本类型原子类
  - AtomicInteger/AtomicLong/AtomicBoolean
  - 核心方法:getAndIncrement()、incrementAndGet()、compareAndSet()
  - 底层原理:Unsafe类+CAS操作
- 引用类型原子类
  - AtomicReference/AtomicStampedReference/AtomicMarkableReference
  - 解决问题:ABA问题(AtomicStampedReference带版本号)
- 数组类型原子类
  - AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray
  - 特性:支持对数组元素进行原子操作
- 字段更新器原子类
  - AtomicIntegerFieldUpdater/AtomicLongFieldUpdater/AtomicReferenceFieldUpdater
  - 特性:无需修改类结构,原子更新对象的volatile字段
- 累加器原子类
  - LongAdder/DoubleAdder(高并发下性能优于AtomicLong)
  - 原理:分段累加,减少CAS竞争
## 二、锁类(XXXLock)
- 可重入锁
  - ReentrantLock
  - 核心特性:可重入、可中断、可超时、支持公平/非公平锁
  - 核心方法:lock()、lockInterruptibly()、tryLock()、unlock()
  - 底层原理:AQS同步器
- 读写锁
  - ReentrantReadWriteLock
  - 特性:读锁共享、写锁独占,支持锁降级
  - 核心组件:ReadLock(读锁)、WriteLock(写锁)
  - 适用场景:读多写少的并发场景
-  stamped锁
  - StampedLock
  - 特性:支持乐观读、悲观读、写锁,性能优于ReentrantReadWriteLock
  - 核心方法:tryOptimisticRead()、validate()、readLock()、writeLock()
- 其他锁
  - LockSupport(线程阻塞/唤醒工具,替代synchronized的wait/notify)
  - Condition(配合Lock实现精准通知,支持多条件队列)
## 三、线程同步类
- AQS(AbstractQueuedSynchronizer)
  - 核心角色:同步器骨架,定义锁的获取/释放逻辑
  - 核心组件:同步队列(CLH队列)、条件队列
  - 核心方法:acquire()、release()、tryAcquire()、tryRelease()
  - 子类实现:ReentrantLock、CountDownLatch、Semaphore等
- CountDownLatch(倒计时门闩)
  - 核心功能:等待多个线程完成后再执行主线程
  - 核心方法:countDown()(计数器减1)、await()(阻塞等待计数器为0)
  - 特性:计数器不可重置,一次性使用
- CyclicBarrier(循环屏障)
  - 核心功能:多个线程到达屏障后再同时继续执行
  - 核心方法:await()(到达屏障并等待)、reset()(重置屏障,可循环使用)
  - 构造参数:parties(参与线程数)、barrierAction(屏障触发后执行的任务)
- Semaphore(信号量)
  - 核心功能:控制并发访问的线程数(限流)
  - 核心方法:acquire()(获取许可)、release()(释放许可)
  - 特性:支持公平/非公平模式,许可数可动态调整
- Exchanger(交换器)
  - 核心功能:两个线程交换数据的同步工具
  - 核心方法:exchange(V x)(交换数据,阻塞直到另一线程到达)
  - 适用场景:线程间数据传递(如生产者-消费者交换数据)
## 四、任务执行器类(Executor体系)
- 核心接口
  - Executor(顶层接口,定义execute(Runnable)方法)
  - ExecutorService(扩展接口,支持任务提交、关闭线程池)
    - 核心方法:submit()(返回Future)、shutdown()、shutdownNow()、awaitTermination()
  - ScheduledExecutorService(定时任务接口)
    - 核心方法:schedule()、scheduleAtFixedRate()、scheduleWithFixedDelay()
- 线程池实现类
  - ThreadPoolExecutor(核心实现类)
    - 核心参数:核心线程数、最大线程数、空闲线程存活时间、任务队列、线程工厂、拒绝策略
    - 任务执行流程:核心线程→任务队列→最大线程→拒绝策略
    - 拒绝策略:AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy
  - ScheduledThreadPoolExecutor(定时任务线程池)
  - ForkJoinPool(分治任务线程池,支持工作窃取)
- 工具类
  - Executors(线程池创建工具类,不推荐生产使用)
    - 常用方法:newFixedThreadPool()、newCachedThreadPool()、newSingleThreadExecutor()、newScheduledThreadPool()
## 五、并发集合类
- ConcurrentXXX系列
  - ConcurrentHashMap(并发哈希表)
    - 底层结构:JDK1.8+ 数组+链表/红黑树(取消分段锁,用CAS+synchronized实现)
    - 核心方法:putIfAbsent()、compute()、merge()
    - 特性:支持高并发读写,线程安全
  - ConcurrentLinkedQueue(并发链表队列)
    - 特性:无锁(CAS)实现,非阻塞,高并发下性能优
    - 核心方法:offer()、poll()、peek()
  - ConcurrentLinkedDeque(并发双端队列)
  - ConcurrentSkipListMap(并发跳表映射)
    - 特性:有序(自然排序/自定义排序)、并发安全,替代TreeMap的并发场景
  - ConcurrentSkipListSet(并发跳表集合)
- CopyOnWriteXXX系列
  - CopyOnWriteArrayList(写时复制数组列表)
  - CopyOnWriteArraySet(基于CopyOnWriteArrayList实现)
  - 底层原理:写操作时复制原数组,修改后替换原数组引用
  - 特性:读操作无锁(高性能)、写操作加锁(低性能),最终一致性
  - 适用场景:读多写少的并发场景
## 六、阻塞队列类(BlockingQueue)
- 核心接口:BlockingQueue
  - 核心方法:put()(阻塞存)、take()(阻塞取)、offer()(非阻塞存)、poll()(非阻塞取)
- 常用实现类
  - ArrayBlockingQueue(数组阻塞队列)
    - 特性:有界、FIFO,支持公平/非公平锁
    - 构造参数:容量、公平性(可选)
  - LinkedBlockingQueue(链表阻塞队列)
    - 特性:默认无界(实际容量Integer.MAX_VALUE),可指定容量,FIFO
  - SynchronousQueue(同步队列)
    - 特性:无容量,存操作必须等待取操作,反之亦然
    - 适用场景:线程间直接传递数据(如生产者-消费者直接交接)
  - PriorityBlockingQueue(优先级阻塞队列)
    - 特性:无界,按优先级排序(自然排序/自定义Comparator)
  - DelayQueue(延迟队列)
    - 特性:元素需实现Delayed接口,按延迟时间排序,延迟到期后才能取出
    - 适用场景:定时任务、缓存过期清理
  - LinkedTransferQueue(链表传输队列)
    - 特性:结合SynchronousQueue和LinkedBlockingQueue优势,支持transfer()方法(阻塞直到元素被消费)
## 七、Future相关类
- 核心接口
  - Future(异步任务结果接口)
    - 核心方法:get()(阻塞获取结果)、get(long timeout, TimeUnit unit)(超时获取)、isDone()、cancel()
  - FutureTask(Future的实现类,可包装Callable/Runnable任务)
    - 状态:NEW→COMPLETING→NORMAL/EXCEPTIONAL→CANCELLED/INTERRUPTED
    - 适用场景:提交单个异步任务,获取执行结果
- CompletableFuture(JDK1.8+ 异步编程工具)
  - 核心特性:支持链式调用、异步回调、异常处理,无需手动阻塞获取结果
  - 核心方法:
    - 异步执行:runAsync()(无返回值)、supplyAsync()(有返回值)
    - 回调处理:thenApply()、thenAccept()、thenRun()
    - 异常处理:exceptionally()、handle()
    - 组合任务:thenCombine()、allOf()、anyOf()
  - 线程池支持:可指定自定义线程池,默认使用ForkJoinPool.commonPool()
## 八、其他辅助工具类
- ThreadLocal(线程本地变量)
  - 核心功能:为每个线程提供独立的变量副本,避免线程安全问题
  - 核心方法:set()、get()、remove()、initialValue()
  - 底层原理:Thread类中的threadLocals(ThreadLocalMap)存储数据
  - 注意事项:避免内存泄漏(线程池场景下需手动remove())
- 并发工具类
  - TimeUnit(时间单位枚举,统一时间粒度转换)
  - ThreadPoolExecutor.DiscardPolicy等(拒绝策略枚举)
- 并发计数器
  - CounterDownLatch(已归类到线程同步类)
  - CyclicBarrier(已归类到线程同步类)
  - Phaser(阶段同步器,支持动态增减参与线程数)