Actor模型为何能统治并发编程五十年从1973年理论到WhatsApp二十亿连接的技术博弈

一个数学模型如何重新定义并发 1973年,麻省理工学院的Carl Hewitt在IJCAI会议上发表了一篇论文,提出了一个看似简单的问题:如果我们将"计算"的最基本单位从函数改为"演员"(Actor),会发生什么?这个问题看似学术,却在随后的五十年里彻底改变了我们构建并发和分布式系统的方式。 ...

16 min · 7814 words

线程本地存储:编译器、链接器与内核的十五年共舞

一个全局变量的"分身术" 1979年,Unix V7引入了一个特殊的全局变量——errno。当系统调用失败时,它会将错误码写入这个变量,供后续代码检查。这在单线程时代完美运作。但到了1990年代,多线程编程成为主流,问题出现了:如果两个线程同时执行系统调用,它们会覆盖彼此的errno值。 ...

9 min · 4315 words

优先级反转:为什么高优先级任务会被低优先级任务"劫持"?从火星探路者到优先级继承协议的技术全景

1997年7月4日,火星探路者成功着陆火星表面,全球为之振奋。但几天后,飞船开始出现神秘的总系统重启,每次都导致数据丢失。媒体将其描述为"软件故障"或"计算机试图同时做太多事情"。实际上,这是一个困扰实时系统领域数十年的经典问题——优先级反转——首次在航天任务中如此戏剧性地暴露。 ...

12 min · 5532 words

工作窃取算法为何能用O(PD)次窃取完成并行计算:从理论证明到工程实现的二十年演进

工作窃取算法为何能用O(PD)次窃取完成并行计算:从理论证明到工程实现的二十年演进 2008年,Intel发布TBB(Threading Building Blocks),2011年Java 7引入ForkJoinPool,2018年Rust的Tokio发布多线程运行时——这些看似无关的技术决策背后,都指向同一个调度算法:工作窃取(Work Stealing)。为什么从高性能计算到异步运行时,工作窃取能成为跨领域的通用解法? ...

13 min · 6315 words

线程池的七个参数为何让无数开发者踩坑从execute流程到ctl的设计哲学

线程创建从来不是免费的。在Java中,每个线程都会分配一个独立的调用栈(默认1MB),线程的创建和销毁需要操作系统参与,涉及系统调用和内存分配。当线程数量达到数千时,这种开销会显著影响系统性能。正是这一根本问题催生了线程池的设计——通过线程复用减少创建销毁的开销。2004年,随着JSR 166的正式发布,Java 5引入了java.util.concurrent包,ThreadPoolExecutor成为这个包中最核心的组件之一。 ...

12 min · 5848 words

ConcurrentHashMap的十五年演进:从分段锁到CAS如何重塑Java并发基石

2003年,Doug Lea向JCP提交了JSR-166规范提案,试图为Java引入一套标准化的并发工具库。在此之前,Java开发者面对并发场景时只能在synchronized、Hashtable和Collections.synchronizedMap之间做出选择——它们要么过于粗粒度,要么性能堪忧。ConcurrentHashMap作为这套工具库的核心组件之一,其设计理念影响了此后二十年Java并发编程的范式。 ...

12 min · 5720 words

一个int变量如何支撑起Java并发包的半壁江山:AQS的设计哲学与实现原理

2004年,Doug Lea在POC CSJP Workshop上发表了一篇题为《The java.util.concurrent Synchronizer Framework》的论文。这篇论文的核心贡献是提出了一个统一的同步器框架——AbstractQueuedSynchronizer(AQS),它用一个int类型的state变量和一个FIFO队列,解决了Java并发编程中几乎所有同步原语的实现问题。 ...

9 min · 4246 words