
java在单线程的条件下,是遵循as-if-serial语义

sychronzied实现可见性的过程
解锁前,把共享变量的最新值刷新到主内存中;
加锁时,清空工作内存,从而使用共享变量时需要从主内存中获取最新的值。
线程解锁前对共享变量的修改,在下次加锁时对其他线程可见。
java语言层面支持的可见性实现方式:
synchronized
volatile
synchronized实现可见性
JMM关于synchronized的两条规定:

线程执行互斥代码的过程:
获得互斥锁
清空工作内存
从主内存拷贝变量的最新副本到工作内存
执行代码
将更改后的共享变量的值刷新到主内存中
释放互斥锁
重排序

as-if-serial

重排序不会给单线程带来内存可见性问题
多线程中程序交错执行时,重排序可能会造成内存可见性问题。
线程执行互斥代码的过程
重排序不会给单线程带来内存可见性问题
as-if-serial
代码书写的顺序与实际执行的顺序不同,指令重排序是编译期或处理器为了提高程序性能而做的优化
synchronized
synchronized
synchronized
synchronized实现可见性

as-if-serial不影响单线程代码的执行效果,但对于多线程可能会造成内存可见性问题
as-if-serial举例
as-if-serial概念及原则
重排序的概念及分类
sychronized实现共享变量可见性的步骤
Synchronized实现可见性原理
Java语言层面支持的可见性实现方式:
再次强调实现共享变量可见性,需要保证如下2点
as-if-serial语义
重排序说明
synchronized实现可见性
指令重排序:
as-if-serial
synchronized 实现可见性:
线程执行互斥代码的过程:
synchronized 实现可见性:
JMM关于synchronized 的两条规定: