内存模型
并发程序中,多个线程之间可见性的问题。如果线程和处理器之间过度协调,同步数据,那么开销太大。需要一个最低标准来保证可见性,这引入了JMM。
JMM规定了JVM必须遵循一组最小的保证,这组保证规定了对变量的写入操作在任何时候将对与其他线程可见。内存栅栏指令也数据JMM定义范围内的东西。JMM保证了在不同平台上也可以获得同样的并发执行结果。
重排序
重排序会发生在,编译器,运行时,硬件对内存的操作重排序。同步操作,保证在重排序之后,JMM的可见性保证不变。
JMM
Happens-Before 规则
程序顺序规则
监视器锁规则
volatile规则
线程启动规则
线程结束规则
中断规则
终结器规则
传递性
发布
不正确的发布的真正原因,就是在发布一个共享对象和另一个线程对这个对象的访问操作之间,没有Happens-Before关系。
延迟初始化的例子
安全发布
用Syncrhonized
提前初始化
用Holder内部类的方式,static