总结
- synchronized 可以保证原子性、可见性、有序性;volatile 能保证可见性、有序性
- synchronized 锁住的是代码块或方法;volatile 锁的是单个变量
对于 synchronized 来说,因为互斥的原因,天然可以保证原子性和有序性,可见性原理我看了很多文档说的都不一样
volatile 可见性原理
- 内存屏障+lock指令(内存屏障是一些cpu指令,有点切面的前后通知的感觉)
- 对 volatile 变量进行写操作后,会给 cpu 发送一条 lock 指令(内存屏障),把当前线程工作内存的变量值回写到主内存
- 每次读取 voaltitle 变量,都会给 cpu 发送一条 unlock 指令(内存屏障),每次都读取主内存的值
volatile 有序性原理
- 内存屏障来实现的
- 为了性能优化,JMM 在不改变正确语义的前提下,会允许编译器和处理器对指令序列进行重排序。JMM 提供了内存屏障阻止这种重排序
- Java 编译器会在生成指令系列时在适当的位置会插入内存屏障指令来禁止特定类型的处理器重排序