谈谈Java Volatile的设计
java volatile为什么要这么设计?
最近在知乎上看见一个有意思的问题:
java volatile为什么要这么设计?
如图所示,这种指令重排规则背后设计的是出于什么原因考虑?我想知道why? 而不是What/How
这个问题看似简单,但是后面其实隐藏着计算机架构的演变:
CPU的多核心时代
说到这儿,就要开始聊一下多线程/多处理器的发展史了。初期计算机性能的提升,主要靠的是主频的提升,后来主频提升遇到了困难,然后就开始了多核处理器的时代。
这里面有一个问题,一个程序可不是天然就能同时跑在多个CPU核心上的,如何让程序员利用多核心处理器提升效率,是一个难题。
这个问题乍一看很简单,我们已经有了线程模型了,直接套用到多核架构上不就可以了么?
但是不行,在原来的单核心架构中,我们的内存模型是 顺序一致性(Sequential consistency):
- 每个线程内部的指令都是按照程序规定的顺序(program order)执行的(单个线程的视角)
- 线程执行的交错顺序可以是任意的,但是所有线程所看见的整个程序的总体执行顺序都是一样的(整个程序的视角)