前言:在早期,多核CPU使用锁总线的方式解决缓存同步问题,即一旦遇到lock指令便由仲裁器选择一个内核独占总线(cas做了锁了总线或缓存行还是volatile做了锁总线或缓存行? - 知乎),其他内核相当于被阻塞搁置,总线连接了各缓存、内存等硬件故锁总线效率很低,后来改用锁缓存(行)。
自从多核CPU出现后用MESI可严格保证缓存一致性,即CPU1中对共享变量修改后CPU2能立刻感知到,即可见性。但CPU受限于(需要等待)信号在核间的来回传输,因而出现了store buffer和invalid queue,但会导致重排序,即CPU1中两指令(准确说是代码)的顺序在CPU2的感知中是相反的,即有序性。用synchronized可同时保证原子性、可见性和有序性,其中原子性通过lock/unlock原子操作实现,后两者通过内存屏障实现(汇编代码中lock#指令与内存屏障的关系,volatile的底层是lock#指令还是内存屏障? - 知乎),volatile没用锁故只可保证后两者,只能通过敦促store buffer和invalid queue立即生效的方式在一定程度上保证线程间的同步,反例如两线程对共享变量做i++仍会出错(