Java并发编程-内存模型

内存模型

并发程序中,多个线程之间可见性的问题。如果线程和处理器之间过度协调,同步数据,那么开销太大。需要一个最低标准来保证可见性,这引入了JMM。

JMM规定了JVM必须遵循一组最小的保证,这组保证规定了对变量的写入操作在任何时候将对与其他线程可见。内存栅栏指令也数据JMM定义范围内的东西。JMM保证了在不同平台上也可以获得同样的并发执行结果。

重排序

重排序会发生在,编译器,运行时,硬件对内存的操作重排序。同步操作,保证在重排序之后,JMM的可见性保证不变。

JMM

Happens-Before 规则

程序顺序规则
监视器锁规则
volatile规则
线程启动规则
线程结束规则
中断规则
终结器规则
传递性

发布

不正确的发布的真正原因,就是在发布一个共享对象和另一个线程对这个对象的访问操作之间,没有Happens-Before关系。

延迟初始化的例子

安全发布

用Syncrhonized

提前初始化

用Holder内部类的方式,static

双重检查加锁,很容易出错。要用volatile