一、synchronized 的有序性
Java 里的操作无序现象是什么?
《深入理解 Java 虚拟机》- P374:
如果在一个线程观察另一个线程,所有操作都是无序的指的是 “指令重排序” 和 “工作内存与主内存同步延迟” 现象。
指令重排是JVM层面对程序进行的优化措施,如果不深入了解,则在并发编程时可能会发生难以发现的Bug。
截止JDK1.8, Java 里只有 volatile 变量是能实现禁止指令重排的。
synchronized 虽不能禁止指令重排,但能保证有序性
这个有序性是相对语义来看的,线程与线程间,每一个 synchronized 块可以看成是一个原子操作,它保证每个时刻只有一个线程执行同步代码,它可以解决上面引述的工作内存和主内存同步延迟现象引发的无序
synchronized 和 volatile 的有序性与可见性是两个角度来看的:
synchronized 是因为块与块之间看起来是原子操作,块与块之间有序可见
volatile 是在底层通过内存屏障防止指令重排的,变量前后之间的指令与指令之间有序可见
synchronized 和 volatile 有序性不同也是因为其实现原理不同:
synchronized 靠操作系统内核互斥锁实现的,相当于 JMM 中的 lock 和 unlock。退出代码块时一定会刷新变量回主内存
vol