并发/JUC
文章平均质量分 94
深入JUC源码
lifallen
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CPU 可见性、乱序执行与 Go 内存模型
CPU可见性问题的本质源于硬件优化机制(StoreBuffer和InvalidateQueue),而非简单的缓存不一致。x86的TSO模型通过硬件保证大部分执行顺序,而ARM的弱一致性模型允许更多指令重排,导致并发问题更易暴露。Go内存模型明确指出,即使Writer按序执行,Reader仍可能观察到乱序结果。两个案例展示了单侧加锁和指针发布时的重排风险。解决方案是正确使用同步原语(锁/原子操作),避免依赖特定硬件,特别在ARM架构上需显式添加内存屏障。开发者应重视数据竞争问题,在弱一致性硬件上进行充分测试。原创 2026-02-09 19:19:58 · 1139 阅读 · 0 评论 -
JUC LongAdder并发计数器设计
本文深入解析了Java并发包中的Striped64及其子类LongAdder的设计原理。Striped64采用空间换时间 策略,通过维护基础值base和动态扩容的Cell数组,将高并发场景下的竞争热点分散到不同Cell中。LongAdder继承这一设计,优先CAS更新base,竞争时转向线程专属Cell,通过哈希映射、动态扩容和重哈希机制降低冲突。相比AtomicLong,LongAdder显著提升写入性能,但sum()结果是弱一致性的。它适用于高并发统计场景,如API调用计数,但不适合需要原子快照的操作。原创 2025-08-15 19:24:16 · 695 阅读 · 0 评论 -
JCTools 无锁并发计数器:ConcurrentAutoTable
ConcurrentAutoTable是一种高性能并发计数器,通过分片和动态扩容机制解决高并发场景下的缓存争用问题。它将计数器分散到long数组中,每个线程根据哈希值更新不同槽位,减少冲突。当检测到激烈争用时,自动创建双倍大小的新数组并形成链表结构,实现无锁扩容。读取时递归求和所有历史数据,提供近似值。相比JDK的LongAdder,它采用完全无锁的链表扩容方式,虽然求和逻辑稍复杂,但展示了更精妙的动态扩容思路。该设计通过改变数据结构适应并发模式,实现了近乎线性的性能扩展。原创 2025-08-15 16:16:34 · 860 阅读 · 0 评论 -
揭秘Java synchronize:轻量级锁升级与偏向锁
JDK15开始默认禁用偏向锁(JEP374),JDK21则完全移除(JEP429)。现代JVM转向轻量级锁和自适应自旋优化,轻量级锁通过三个阶段实现:快速加锁(无竞争CAS)、自旋等待(短暂轮询)和锁膨胀(升级为重量级锁)。膨胀过程由inflate_and_enter函数处理,涉及状态同步、哈希表管理和线程唤醒。当原持有者(线程A)释放时,若发现锁已膨胀,会通过CAS失败感知状态变化,转为重量级释放流程。整个过程通过CAS原子性保证安全迁移,冲突本身成为状态转换的驱动机制,体现了JVM锁机制的自适应性原创 2025-08-08 20:15:02 · 860 阅读 · 0 评论 -
JCTools MpscArrayQueue生产者索引优化解析
MpscArrayQueue是JCTools中的高性能无锁并发队列,支持多生产者单消费者(MPSC)模式。其核心设计包括:1)通过继承链实现缓存行填充,隔离producerIndex、producerLimit和consumerIndex字段,避免伪共享;2)producerLimit机制减少生产者读取consumerIndex的volatile开销;3)CAS竞争生产槽位与有序写入确保并发安全。消费者采用自旋等待处理生产者写入延迟,单消费者设计简化了并发控制。通过精细的内存布局和内存语义选择,实现了高吞吐原创 2025-08-05 19:57:22 · 967 阅读 · 0 评论 -
Disruptor核心:Sequencer解析
摘要:AbstractSequencer是Disruptor框架中所有序列器的基类,为单生产者和多生产者序列器提供通用功能。它管理消费者序列号(GatingSequences)以确保数据安全,并维护生产者游标(cursor)。SingleProducerSequencer通过无锁设计和缓存优化实现单线程高性能,而MultiProducerSequencer使用原子操作和availableBuffer机制支持多线程安全操作。两者在内存布局上采用不同策略:单生产者使用填充避免伪共享,多生产者依赖对象内存隔离。原创 2025-08-04 16:38:51 · 989 阅读 · 0 评论 -
Disruptor高性能 线程 WaitStrategy解析
Disruptor框架提供了多种等待策略。BlockingWaitStrategy是最保守的策略,使用锁机制降低CPU占用但延迟较高;BusySpinWaitStrategy最激进,通过忙循环实现最低延迟但CPU占用最高;YieldingWaitStrategy和SleepingWaitStrategy采用渐进式策略,在自旋和让步之间平衡;PhasedBackoffWaitStrategy则综合多种策略,根据等待时间自动降级。此外还有LiteBlockingWaitStrategy等优化变体。原创 2025-08-03 16:36:51 · 1035 阅读 · 0 评论 -
AbstractExecutorService:Java并发核心模板解析
AbstractExecutorService采用模板方法模式简化了自定义线程池的创建。它实现了任务提交(submit)、批量执行(invokeAll)和竞速执行(invokeAny)等复杂逻辑,而将核心的execute方法交由子类实现。关键设计包括:提供ExecutorCompletionService支持按完成顺序获取结果。ExecutorCompletionService通过内部QueueingFuture和阻塞队列,实现了任务提交与结果获取的解耦原创 2025-08-02 18:17:00 · 744 阅读 · 0 评论 -
深入解析 Disruptor 门面类 以及和JCTools比较
Disruptor是一个高性能线程间消息传递库,由LMAX开发,采用环形缓冲区(RingBuffer)和无锁设计实现极低延迟和高吞吐量。其核心优势包括:1) 内存预分配避免GC;2) 通过缓存行填充解决伪共享问题;3) 支持单/多生产者模式;4) 灵活的消费者依赖关系管理。主要组件包括RingBuffer、Sequence、Sequencer和SequenceBarrier等。相比JCTools队列,Disruptor更适用于复杂事件处理场景,支持多播和消费者依赖图构建。原创 2025-08-01 10:05:01 · 922 阅读 · 0 评论 -
Disruptor高性能基石:Sequence并发优化解析
本文分析了Disruptor框架中Sequence类的核心设计思想。该类通过缓存行填充技术(LhsPadding/Value/RhsPadding三层继承结构)防止伪共享问题,确保value字段独占64字节缓存行。同时利用VarHandle实现精细的并发控制:通过releaseFence()保证写入顺序和内存可见性,acquireFence()确保读取顺序,配合CAS和原子操作方法构建高效的无锁同步机制。作为Disruptor协调基础,Sequence用于跟踪生产者游标、消费者进度和门控序列原创 2025-07-31 19:17:31 · 1012 阅读 · 0 评论 -
揭秘Disruptor RingBuffer高性能核心机制
RingBuffer是一种高性能的循环数据结构,用于线程间高效数据交换。其核心特点是:1)数据对象预分配避免GC开销;2)通过位运算替代取模实现快速索引;3)采用缓存行填充解决伪共享问题;4)生产者通过两阶段提交(申请槽位+发布事件)写入数据;5)消费者通过SequenceBarrier协调读取进度。RingBuffer将存储职责与并发控制解耦,通过Sequencer接口支持单/多生产者模式,并提供了推/拉两种消费模型。这种设计结合了多种底层优化,使其成为高吞吐、低延迟并发编程的理想选择。原创 2025-07-31 16:01:31 · 1962 阅读 · 0 评论 -
揭秘Netty高性能线程本地存储机制:FastThreadLocal
Netty的InternalThreadLocalMap和FastThreadLocal机制通过优化线程本地存储来提高性能。InternalThreadLocalMap使用数组存储代替哈希表,每个FastThreadLocal实例获得唯一索引进行直接访问,避免了哈希冲突。FastThreadLocalThread线程类型内置InternalThreadLocalMap,进一步加速访问。这套机制通过预定义缓存、兼容普通线程和确定性资源清理,在高并发场景下相比标准ThreadLocal有显著性能优势,成为Net原创 2025-06-21 10:02:22 · 738 阅读 · 0 评论 -
剖析 ConcurrentHashMap 源码
本文深入剖析了Java并发容器ConcurrentHashMap的核心设计思想与实现机制。首先,通过分析ConcurrentMap接口的原子操作方法及其CAS语义实现,揭示了无锁编程模式的设计理念;其次,详细解读了ConcurrentHashMap的关键实现,包括分段计数、树化/退化机制、特殊节点处理等技术,展示了其如何通过分层锁策略(空桶CAS+非空桶synchronized)实现高并发;重点解析了sizeCtl控制变量和扩容机制,阐明了多线程协作扩容的智能调度算法,包括扩容标记生成、线程计数管理。原创 2025-06-16 16:02:16 · 2053 阅读 · 0 评论 -
揭秘StampedLock为何弃用AQS
StampedLock是Java提供的一种高性能读写锁机制,其核心设计特点包括: 三种锁模式:写锁(独占)、读锁(共享)和乐观读(无锁验证) 状态编码:使用long类型state字段,低7位记录读锁计数,第8位标识写锁,高位存储序列号 乐观读机制:通过tryOptimisticRead获取版本戳,validate验证数据一致性 CLH队列变体:使用改进的CLH队列管理等待线程,读者分组优化 锁转换:支持tryConvertToWriteLock等锁模式原子转换。原创 2025-06-16 10:58:18 · 1006 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier与Semaphore 核心技术解析
文章深入分析了CountDownLatch、CyclicBarrier和Semaphore三大并发工具的核心实现。CountDownLatch基于AQS共享模式实现一次性计数器同步,通过state字段存储计数值,在计数归零时唤醒所有等待线程。CyclicBarrier采用ReentrantLock+Condition实现可重复使用的栅栏同步,支持周期性重置。Semaphore同样基于AQS,通过state管理许可证数量,提供公平与非公平两种获取策略。原创 2025-06-15 15:59:03 · 1158 阅读 · 0 评论 -
深入解析ReentrantReadWriteLock读写锁机制
ReentrantReadWriteLock实现了读写分离的锁机制,具有以下核心特性:1)支持读锁共享(允许多线程并发读)和写锁独占;2)提供公平/非公平两种策略;3)支持锁降级和可重入。内部采用AQS框架管理同步状态,使用CAS保证原子性,通过ThreadLocal优化读锁计数。关键设计包括:状态编码(高32位读计数/低32位写计数)、锁降级机制(写锁释放前获取读锁)、以及读锁获取的三级缓存优化(firstReader/cachedHoldCounter/readHolds)。适用于读多写少的并发场景。原创 2025-06-14 16:08:46 · 864 阅读 · 0 评论 -
深入解析ConcurrentSkipListMap源码
ConcurrentSkipListMap通过无锁跳表结构实现高效并发操作,核心特点包括:1)采用CAS原子操作实现节点/索引的增删,避免全局锁;2)三阶段删除策略(逻辑删除-标记节点-物理删除)确保并发安全;3)动态调整跳表高度,插入时按1/4概率构建索引;4)遍历时自动清理无效节点;5)利用VarHandle内存屏障保证可见性。其设计亮点在于将跳表的O(logn)查询优势与无锁并发结合,通过协作式删除和弱一致性迭代器实现高吞吐量。原创 2025-06-13 15:45:53 · 1067 阅读 · 0 评论 -
SynchronousQueue:零容量的同步传输神器
Java的SynchronousQueue是一种零容量的阻塞队列,它不存储任何元素,而是直接在生产者和消费者线程间建立同步传输机制。该队列通过继承LinkedTransferQueue的核心并发机制,实现了两种工作模式:公平模式(FIFO)和非公平模式(LIFO)。其设计亮点包括:零存储开销、高效的CAS操作、可选公平性策略,以及生产者和消费者的直接同步交换。典型应用场景包括线程池任务传递和需要同步handoff的生产者-消费者模式。使用时需注意,每个put操作必须匹配对应的take操作,否则线程会被阻塞。原创 2025-06-12 15:50:02 · 1003 阅读 · 0 评论 -
LinkedTransferQueue核心设计与高效并发实现
LinkedTransferQueue是一种高性能并发队列,采用无锁设计实现生产者-消费者直接匹配机制。其核心特性包括:双重队列结构:支持数据节点和请求节点的直接匹配,避免传统队列的入队出队开销智能传输机制:提供transfer/tryTransfer方法,允许生产者直接将元素传递给等待的消费者高效并发控制:通过CAS操作、松弛机制和分阶段清理策略优化性能内存管理优化:采用自链接节点和概率性清理策略减少内存占用线程适配:针对不同线程类型(普通/ForkJoin/虚拟)优化自旋和阻塞策略原创 2025-06-12 11:21:44 · 998 阅读 · 0 评论 -
ReentrantLock
本文深入分析了ReentrantLock的核心实现,重点探讨其基于AQS(AbstractQueuedSynchronizer)的架构设计与关键机制。文章首先剖析ReentrantLock的三层架构模式(接口层、抽象层、实现层),揭示其通过委托Sync内部类(继承AQS)实现锁功能的核心逻辑。原创 2025-06-09 15:46:22 · 963 阅读 · 0 评论 -
CopyOnWriteArrayList和CopyOnWriteArraySet :并发安全的写时复制机制
CopyOnWriteArrayList采用"写时复制"机制实现线程安全,适合读多写少场景。其核心特点包括:1)读操作无锁直接访问volatile数组;2)写操作加锁并复制新数组,保证线程安全;3)迭代器使用快照机制避免并发修改异常;4)优化了批量操作和条件添加(addIfAbsent)等场景。CopyOnWriteArraySet基于CopyOnWriteArrayList实现,通过调用列表的线程安全方法提供Set功能。原创 2025-06-09 09:54:35 · 1198 阅读 · 0 评论 -
Fork/Join框架:CountedCompleter与RecursiveTask深度对比
Java Fork/Join框架中CountedCompleter与RecursiveTask的核心差异在于任务管理机制。CountedCompleter通过挂起计数自动管理任务依赖,支持动态子任务增减,并在任务完成后自动触发回调(onCompletion),避免了线程阻塞。而RecursiveTask需手动合并子任务结果,可能造成线程阻塞。在复杂场景如并行排序中,CountedCompleter在性能、灵活性和代码简洁性上更具优势,尤其适合需要自动触发后续操作的任务链。原创 2025-06-08 12:19:56 · 840 阅读 · 0 评论 -
DelayQueue、ScheduledThreadPoolExecutor 和 PriorityBlockingQueue :怎么利用堆实现定时任务
Java中的DelayQueue和ScheduledThreadPoolExecutor通过Leader-Follower模式优化线程唤醒机制,减少"惊群效应"。DelayedWorkQueue支持O(1)取消任务,同样使用Leader-Follower模式。PriorityBlockingQueue采用双锁机制扩容,释放主锁时允许消费,通过智能堆调整算法维护堆性质。这些设计显著提升了并发性能。原创 2025-06-07 14:56:26 · 713 阅读 · 0 评论 -
揭秘ThreadLocal:黄金分割哈希+弱引用的线程隔离
ThreadLocal通过线程专属的ThreadLocalMap实现线程安全的数据隔离。每个线程持有独立的映射表,以ThreadLocal为key存储数据副本,避免共享状态和竞态条件。其设计亮点包括:黄金分割哈希算法减少冲突、WeakReference自动内存管理、开放地址法处理哈希碰撞。支持普通/可继承/终止处理三类存储类型,并优化虚拟线程访问。该架构实现了无锁O(1)访问、自动内存回收和均匀负载,在保证线程安全的同时兼具高性能。原创 2025-06-07 13:54:25 · 656 阅读 · 0 评论 -
LinkedBlockingQueue、ConcurrentLinkedQueue和ArrayBlockingQueue深度解析
本文详细解析了Java并发包中的三种主要队列实现:LinkedBlockingQueue、ConcurrentLinkedQueue和ArrayBlockingQueue,重点探讨其设计原理。LinkedBlockingQueue:基于链表的两锁(生产/消费分离)阻塞队列,支持容量限制,通过put/take实现阻塞操作,优化级联唤醒以减少竞争。ConcurrentLinkedQueue:无锁(CAS操作)无界队列,采用Michael-Scott算法,通过延迟更新head/tail原创 2025-06-06 22:28:47 · 1230 阅读 · 0 评论 -
深入解析FutureTask:原理与实战
FutureTask是Java并发编程中的核心类,实现了RunnableFuture接口。其内部采用volatile state字段管理7种任务状态,通过CAS操作确保原子性转换。关键实现包括:1) run()方法执行Callable任务并处理结果;2) get()方法阻塞等待结果,支持超时机制;3) 基于WaitNode的LIFO等待队列实现轻量级线程阻塞/唤醒;4) 取消任务时通过中断机制终止执行。设计亮点在于用CAS替代重量级锁,通过LockSupport实现高效线程调度,由执行线程或取消线程唤醒。原创 2025-06-04 17:05:44 · 823 阅读 · 0 评论 -
Java Fork/Join框架:三大核心组件ForkJoinTask、ForkJoinWorkerThread 和 ForkJoinPool 深度解析
Fork/Join框架是Java并行计算的核心工具,由三个关键组件构成——ForkJoinPool作为执行环境管理线程池和任务调度,ForkJoinWorkerThread作为执行单元处理具体任务,ForkJoinTask作为计算单元支持任务分解与合并。框架采用工作窃取算法,工作线程优先处理本地队列任务(LIFO模式),空闲时可窃取其他线程任务(FIFO模式)。WorkQueue作为核心数据结构,采用双端队列设计和CAS操作实现高效并发访问,并通过@Contended注解避免伪共享问题。原创 2025-06-04 16:08:48 · 1110 阅读 · 0 评论 -
深入解析ForkJoinPool核心原理
ForkJoinPool是Java并发框架中的核心类,专门为分治算法和工作窃取设计。它通过Fork/Join模式高效执行可分解的并行任务,比传统线程池更适合处理递归分解的计算任务。该框架提供了三种任务提交方法(invoke、submit、execute),支持工作窃取算法、线程管理机制和任务超时控制。关键特性包括:1) 工作窃取算法实现负载均衡;2) ManagedBlocker机制处理阻塞操作;3) 调度功能支持延迟和周期性任务;4) 超时控制机制。ForkJoinPool还包含common池。原创 2025-06-03 16:54:18 · 1274 阅读 · 0 评论 -
ForkJoinTask深度解析:Java并行计算利器
ForkJoinTask采用"分治"思想,通过fork()分解任务并行执行,join()合并结果。文章分析了其两种实现(RecursiveAction无返回值,RecursiveTask有返回值),并探讨了关键方法fork()、join()、invoke()的工作原理。特别深入剖析了任务状态管理、工作窃取机制和异常处理等底层实现,阐述了ForkJoinTask与ForkJoinPool的协作机制,以及在不同调用场景(直接invoke、pool提交、fork等)下的执行路径差异。原创 2025-06-03 15:35:33 · 996 阅读 · 0 评论 -
揭秘 CompletableFuture 的设计精髓(深入实现分析)
通过Completion构建有向无环图(DAG)实现任务流水线。关键设计包括:无锁栈管理:通过Treiber栈(CAS操作)维护依赖关系。结果传递与异常处理:结果存储于volatile字段,异常通过AltResult封装异步协作:双源操作通过CoCompletion双向监听;Signaller实现阻塞等待组合操作:anyOf和allOf分别通过AnyOf监听器和二叉树(BiRelay)协调超时机制:结合Timeout和Canceller实现任务取消与超时处理原创 2025-06-02 13:11:31 · 2073 阅读 · 0 评论 -
揭秘 CompletableFuture 的设计精髓(基础)
CompletionStage接口实现了Java异步编程的核心功能,通过volatile字段存储异步结果或异常(用AltResult封装),并采用Treiber栈结构管理依赖操作。其无锁设计通过CAS操作保证原子性,支持单/双源依赖和阻塞唤醒机制。完成触发流程包括complete()设置结果和postComplete()遍历依赖栈。异常处理通过AltResult包装传播,JDK9+扩展了超时控制等高级功能。关键设计包括观察者模式、工厂模式和无锁化Treiber栈,性能优化体现在循环处理栈结构和资源清理机制。原创 2025-06-02 13:11:28 · 876 阅读 · 0 评论 -
Java异步编程:CompletionStage接口详解
CompletionStage是Java8引入的异步编程接口,提供链式异步操作、多阶段组合和异常处理能力。主要功能包括单阶段依赖操作(如thenApply)、双阶段组合(如thenCombine)、任一完成操作(如applyToEither)以及异常处理方法(如exceptionally)。从Java12开始新增默认方法加强异常处理灵活性,支持同步、默认异步和自定义执行器三种执行模式。该接口以声明式方式构建异步操作,是Java异步编程的重要基础。原创 2025-06-01 22:35:50 · 936 阅读 · 0 评论 -
深入解析JUC AQS:Java并发核心框架
AQS是并发包的核心框架,为ReentrantLock、Semaphore等同步器提供基础机制。AQS通过volatile变量state表示同步状态,使用CLH变体的FIFO队列管理线程排队,支持独占和共享两种模式。其核心流程包括:获取状态时尝试tryAcquire,失败则入队等待;释放状态时调用tryRelease并唤醒后继节点。ConditionObject实现条件变量机制,通过await/signal协调线程等待与唤醒。AQS采用原子CAS操作、惰性初始化、状态驱动等设计,兼顾性能与灵活性。原创 2025-05-30 15:52:45 · 832 阅读 · 0 评论 -
深入解析Java线程池:ThreadPoolExecutor设计精髓
线程池设计通过循环复用线程和阻塞队列解决核心矛盾。其核心机制是将线程run()方法封装在循环中,由线程池策略控制生命周期,实现线程复用。当无任务时,线程通过阻塞队列(生产者-消费者模型)进入等待状态避免CPU空耗。JUC线程池在此基础上扩展出精细配置:通过core/max线程数平衡资源与响应;提供多种队列和拒绝策略应对任务特性;支持线程工厂定制和生命周期管理。原创 2025-05-29 15:34:05 · 1903 阅读 · 0 评论
分享