我们知道,并发编程的三个重要特性:原子性,有序性,可见性,从这三个方面入手分析synchronized与volatile的区别
原子性:
volatile无法保证原子性
synchronized是排它锁,呗synchronized修饰的代码不能被打断,所以具有原子性
有序性
volatile进制JVM编译器及处理器对volatile修饰的指令重排序
synchronized是以程序的串行化执行来保证顺序性,synchronized代码块中的代码指令也可以重排序
可见性
volatile使用机器指令lock将修改后的工作内存中的数据强制刷新到主内存,并迫使其他线程的工作内存数据失效,从而保证可见性
synchronized借助jvm指令monitorenter和monitorexit使代码串行化,在monitorexit时所有共享资源都将刷新到主内存,从而保证可见性