[Java]synchronized与volatile的区别

我们知道,并发编程的三个重要特性:原子性,有序性,可见性,从这三个方面入手分析synchronized与volatile的区别

原子性:

volatile无法保证原子性

synchronized是排它锁,呗synchronized修饰的代码不能被打断,所以具有原子性

有序性

volatile进制JVM编译器及处理器对volatile修饰的指令重排序

synchronized是以程序的串行化执行来保证顺序性,synchronized代码块中的代码指令也可以重排序

可见性

volatile使用机器指令lock将修改后的工作内存中的数据强制刷新到主内存,并迫使其他线程的工作内存数据失效,从而保证可见性

synchronized借助jvm指令monitorenter和monitorexit使代码串行化,在monitorexit时所有共享资源都将刷新到主内存,从而保证可见性

你可能感兴趣的:(java,开发语言)