Java并发09:CPU缓存与多核架构 - 并发问题的硬件根源

引言:一个令人困惑的性能问题 某电商系统在双十一期间做性能压测,工程师发现一个奇怪的现象: // 订单统计类 public class OrderStats { private volatile long successCount = 0; // 成功订单数 private volatile long failCount = 0; // 失败订单数 public void recordSuccess() { successCount++; } public void recordFail() { failCount++; } } 在32核机器上,当16个线程同时调用recordSuccess()时,性能只有单线程的2倍,远低于理论值16倍! 更诡异的是:当把两个字段分开到不同的类中,性能提升了8倍! // 拆分后 public class SuccessStats { private volatile long successCount = 0; // 单独一个类 } public class FailStats { private volatile long failCount = 0; // 单独一个类 } 为什么会这样?这就是**False Sharing(伪共享)**问题,根源在于CPU缓存的工作机制。 要理解这个问题,我们需要从CPU缓存的硬件架构说起。 一、为什么需要CPU缓存? 1.1 计算机存储层次结构 计算机的存储系统是一个金字塔结构: 速度快 容量小 价格贵 ↓ ┌───────────────┐ │ 寄存器 │ ~1ns (几十个) ├───────────────┤ │ L1 Cache │ ~2ns (32KB-128KB) ├───────────────┤ │ L2 Cache │ ~10ns (256KB-1MB) ├───────────────┤ │ L3 Cache │ ~40ns (8MB-64MB) ├───────────────┤ │ 主内存 │ ~100ns (8GB-128GB) ├───────────────┤ │ SSD硬盘 │ ~100μs (256GB-2TB) ├───────────────┤ │ 机械硬盘 │ ~10ms (1TB-10TB) └───────────────┘ ↑ 速度慢 容量大 价格便宜 1.2 性能差距有多大? 如果把CPU访问L1缓存的时间比作1秒,那么: ...

2025-11-20 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...