锁和总线课程总结
CPU 做一次加法不到 0.2 纳秒。机械硬盘查一次数据3 到 5 毫秒。这俩放一块CPU 简直就是个大冤种算得飞快然后干等数据。为了不让它等才有了寄存器、高速缓存、内存、磁盘这一层层的存储体系。但缓存一多新问题就来了多核。每个核都有自己的缓存。变量 x 在 A 核缓存里是 1在 B 核缓存里也是 1。A 把它改成 2B 不知道还拿着 1 在那算。这不出事才怪。所以并发同步说到底就是在解决两件事数据别读旧了写别写乱了。CPU 和内存之间靠总线传数据。讲座里说常见是 64 根线半双工同一时间只能一个方向传。我理解就是一条窄路还不能同时双向走车。多核一起读写冲突就很正常。双通道听起来厉害但多核环境下反而更容易乱所以不是简单加通道就完事。最直接的办法就是加锁。谁拿到锁谁进来其他人门口排队。同一时间只有一个核心能操作共享资源。好处是安全逻辑也直观。坏处是慢。你排队的时候别的核心只能等着计算资源就浪费了。Java 里的synchronized、ReentrantLock都属于这种独占锁。控制力度最强但并发性能也最差。所以加锁不是越多越好。临界区能小就小能不加就不加但该加还得加。我一开始以为总线嗅探也是一种锁后来发现不是。它更像硬件在帮缓存擦屁股。大概意思是每个核都在监听总线。A 核改了 x要写回去。B 核嗅到了“哎这个地址我缓存里也有。”然后 B 核就把自己那份标记成失效。下次 B 再读 x发现缓存不顶用了就重新去拿最新的。MESI 那些缓存一致性协议就是干这个的。Modified、Exclusive、Shared、Invalid 几种状态来回切。讲座没展开我也还没啃透但至少知道它不是锁它解决的是缓存一致性。不过要注意总线嗅探不保证count这种复合操作不出问题。读、加、写三步中间还是可能插进来别的核。所以原子性还得靠锁或者 CAS。独占锁就是最狠的那种同一时间只允许一个线程读或者写。读写锁稍微聪明点读的时候大家一起读没事写的时候只能一个人写读和写不能同时来。读多写少的场景读写锁比独占锁舒服很多。但要是写特别频繁读锁写锁来回抢也不见得快多少。还有乐观锁CAS、版本号那种。先干写回的时候看版本变没变变了就重试。冲突少的时候很香冲突多的时候一直重试也挺烦。我现在的理解是控制力度大概这样独占锁 读写锁 乐观锁越安全通常越慢。选哪个就看你是读多还是写多冲突多不多临界区大不大。讲座最后讲了从机器语言、汇编到 C再到 Java、Python。语言是越来越像人话但并发问题没消失。那些高级语言里的锁、原子类、内存屏障底下还是原子指令、总线传输、缓存一致性那一套。跑得再高也还是踩在硬件和操作系统上。