怎么来定义顺序呢?《深入理解Java虚拟机第三版》有提到
Java程序中天然的有序性可以总结为一句话:如果在本线程内观察,所有操作都是天然有序的。如果在一个线程中观察另一个线程,所有操作都是无序的。前半句是指“线程内似表现为串行的语义”,后半句是指“指令重排”现象和“工作内存与主内存同步延迟”现象。
- 「synchronized」 的有序性是持有相同锁的两个同步块只能串行的进入,即被加锁的内容要按照顺序被多个线程执行,但是其内部的同步代码还是会发生重排序,使块与块之间有序可见。
- 「volatile」的有序性是通过插入内存屏障来保证指令按照顺序执行。不会存在后面的指令跑到前面的指令之前来执行。是保证编译器优化的时候不会让指令乱序。
- 「synchronized 是不能保证指令重排的」。
- synchronized可以保证原子性和可见性
volatile关键字关于指令重排序的解释
// volatile关键子保证代码不进行指令重排的意思是被volatile修饰的代码不会跑在代码1和代码2前面,
//也不会跑到代码3和代码4后面,但是不能保证代码1和代码2发生重排序的问题或者代码3和代码4进行重排序
public volatile int a=15