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

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

16 min · 7814 words

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

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

9 min · 4315 words

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

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

12 min · 5720 words

内存序为何多线程程序需要六种不同的同步语义

一个看似简单的计数器,在多线程环境下却能暴露出计算机系统最深层的复杂性。当你写下x++这样的代码时,编译器可能将其重排序,CPU可能延迟写入,缓存一致性协议可能在不同核心间传递失效消息——这些操作并非恶意捣乱,而是现代处理器为了榨取每一分性能而精心设计的优化策略。 ...

8 min · 3811 words

内存屏障:多核编程中被误解最深的概念

2017年,一位资深C++开发者在Stack Overflow上发帖求助:他的无锁队列在x86服务器上运行完美,但移植到ARM服务器后,偶尔会丢失数据。代码经过了多轮Code Review,逻辑无懈可击。最终,一位编译器开发者指出问题所在:缺少一条内存屏障。 ...

9 min · 4343 words