随笔分类 -  并发编程艺术

化整为零、分而治之、异步编排:一文读懂现代并发的底层心法
摘要:LongAdder:化整为零,热点分散 在Java多线程编程中,‌原子变量(如AtomicLong)‌通过CAS操作实现线程安全的累加。然而,在高并发场景下,大量线程争抢同一原子变量会引发严重的‌缓存一致性问题‌。 ‌ 1)缓存行伪共享‌:多个线程频繁更新同一缓存行,导致缓存失效和MESI协议频繁触 阅读全文

posted @ 2025-12-22 21:34 poemyang 阅读(214) 评论(0) 推荐(0)

深入解析 Disruptor:从RingBuffer到缓存行填充的底层魔法
摘要:Disruptor,这一由英国金融巨头LMAX匠心打造的高性能并发框架,自诞生之初便肩负着在处理生产者-消费者问题时,追求极致吞吐量与超低延迟的使命。令人瞩目的是,LMAX公司凭借Disruptor框架,成功将订单处理速度飙升至每秒600万次交易(Transactions Per Second,TP 阅读全文

posted @ 2025-12-11 20:13 poemyang 阅读(155) 评论(0) 推荐(0)

并发编程的三大基石:从底层逻辑聊透“同步、互斥与分工”
摘要:当单核性能的狂飙突进时代缓缓落幕,多核架构已成为算力增长的主旋律。然而,更多的核心并不天然等同于更强的性能。这就像将一条单行道拓宽为多车道高速公路,如果缺乏高效的交通调度系统,车辆(线程)间的抢道与拥堵(锁竞争)反而会造成更严重的瘫痪。 Java,作为企业级应用的中流砥柱,其并发设计的智慧恰在于此: 阅读全文

posted @ 2025-12-10 21:24 poemyang 阅读(259) 评论(0) 推荐(0)

Goroutine间的“灵魂管道”:Channel如何实现数据同步与因果传递?
摘要:Channel是连接Goroutine的“管道”,是CSP理念在Golang中的具象化实现。它不仅是数据传递的队列,更是Goroutine间同步的天然工具,让开发者无需诉诸显式的锁或条件变量。 func main() { ch := make(chan int, 1) // 创建一个int,缓冲区大 阅读全文

posted @ 2025-10-14 22:13 poemyang 阅读(231) 评论(2) 推荐(0)

“不要通过共享内存来通信”——深入理解Golang并发模型与CSP理论
摘要:Golang 在设计上另辟蹊径,其并发哲学的核心信条是:“不要通过共享内存来通信,而要通过通信来共享内存。” (Do not communicate by sharing memory; instead, share memory by communicating.) 这一理念源自通信顺序进程(Co 阅读全文

posted @ 2025-10-13 21:15 poemyang 阅读(404) 评论(0) 推荐(0)

揭秘JUC:volatile与CAS,并发编程的两大基石
摘要:JUC(java.util.concurrent)并发包,作为Java语言并发编程的利器,由并发编程领域的泰斗道格·利(Doug Lea)精心打造。它提供了一系列高效、线程安全的工具类、接口及原子类,极大地简化了并发编程的开发流程与管理复杂度。 JUC并发包与happens-before、内存语义的 阅读全文

posted @ 2025-09-27 11:28 poemyang 阅读(230) 评论(0) 推荐(1)

从MESA模型到锁升级:synchronized性能逆袭的底层逻辑
摘要:管程(Monitor)是一种用于管理共享资源访问的程序结构,能确保同一时刻只有一个线程访问共享资源,解决并发编程中的互斥和同步问题。MESA模型是管程的经典实现,主要由入口等待队列和条件变量等待队列构成。 1)入口等待队列‌:确保线程互斥,多个线程试图进入管程时,仅一个线程能成功,其余线程在入口等待 阅读全文

posted @ 2025-09-25 10:34 poemyang 阅读(137) 评论(1) 推荐(0)

一把锁的两种承诺:synchronized如何同时保证互斥与内存可见性?
摘要:在多线程环境中,‌临界区(Critical Section)是指一次只能由一个线程执行的代码段,这些代码通常涉及对共享资源(如变量、数据结构、文件或数据库连接)的访问或修改。临界区的存在是为了解决并发控制中的两大核心问题。 ‌ 1)数据不一致性‌:如果多个线程同时对共享资源进行写操作,可能会破坏数据 阅读全文

posted @ 2025-09-24 10:14 poemyang 阅读(338) 评论(0) 推荐(0)

从混沌到秩序:Java共享内存模型如何通过显式约束驯服并发?
摘要:并发编程的本质,是在看似混沌的并行执行中建立秩序,确保程序的确定性。为达此目的,并发原语应运而生,它们是构筑一切并发系统的基石。其核心使命在于,通过定义一套明确的交互范式,消除因资源共享而引发的竞态条件(Race Condition),从而驯服并发世界的不确定性。 从Java的显式锁(synchro 阅读全文

posted @ 2025-09-23 10:14 poemyang 阅读(44) 评论(0) 推荐(0)

没有Happens-Before?你的多线程代码就是‘一锅粥’!
摘要:内存模型与happens-before:开发者与硬件的和平条约 在前文中,提到处理器通过一些特殊指令(如 LOCK、CMPXCHG、内存屏障等)来保障多线程环境下程序的正确性。然而,这种做法仍然存在几个显著问题。 1)底层指令实现复杂且晦涩:处理器指令的细节往往难以理解,开发者需要付出大量的时间和精 阅读全文

posted @ 2025-07-30 14:46 poemyang 阅读(599) 评论(0) 推荐(0)

我的代码出现幻觉?说好的a = 1; x = b,怎么成了x = b; a = 1?
摘要:有序性:代码执行的幻觉 前面讲到通过缓存一致性协议,来保障共享变量的可见性。那么是否还有其他情况,导致对共享变量操作不符合预期结果。可以看下面的代码: private int a, b; private int x, y; public void test() { Thread t1 = new T 阅读全文

posted @ 2025-07-28 15:14 poemyang 阅读(703) 评论(0) 推荐(0)

我的代码背叛了我?为什么 a=1, b=2,最后x和y都等于0?
摘要:随着多核架构的普及,并发编程已成为开发者不可或缺的核心技能。在学习过程中,开发者常会遇到这样的困惑:正确编写的单线程代码,为何在并发环境下可能瞬间失效?看似有序的语句执行后,为何结果却混乱不堪?这些问题,都指向了编程领域的一个关键课题——内存模型。 本文以Java语言为例,剖析共享数据在并发环境中的 阅读全文

posted @ 2025-07-25 15:08 poemyang 阅读(869) 评论(0) 推荐(0)

导航