java的内存模型有3个特征:原子性,可见性,有序性

1 原子性:由java内存模型来直接保证的原子性操作包括:read、load、assign、use、store、write,如果应用场景需要一个更大范围的原子性保证,可以通过lock、unlock来满足这个需求,实现这个是通过指令monitorenter和monitorexit来隐式完成,这两个指令反映到java代码就是synchronized关键字。

2 可见性:可见性值一个线程修改了共享变量值时,其他线程能够立即得知这个修改,volatile修饰的变量可以做到,java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式实现可见性,volatile的特殊规则保证了新值立即同步到主内存,以及每次使用前立即从主内存刷新新值。除了volatile外,还有synchronized和final;final关键字的可见性是指:被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把this的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到初始化了一半的对象),那么在其他线程中就能看见final字段的值

3 有序性:java查询中天然有序性可以总结为一句话:如果本线程内观察,所有操作都是有序的;如果一个线程中观察另一个线程,所有操作都是无序的;前一句是指“线程内是表现为串行的语义”,后半句是指“指令重排序”现象和“工作内存与主内存不同延迟”现象。