1、原子性
- volatile 无法保证原子性;
- synchronized 的排他锁被其修饰的代码执行不被打断保证原子性
2、有序性
- volatile是在jvm编译器对所修饰的代码禁止指令重排保证有序
- synchronized是以程序的串行化执行保证有序性,代码是可以被重排的
3、可见性
- volatile依靠机器指令lock将修改后的缓存中的数据强制刷新到 主内存中,并且强制其他线程的工作内存数据失效
- synchronized依靠jvm指令monitorenter和monitorexit使代码串行化,在monitorexit时所有共享资源都刷新到主内存。s
ynchronized
修饰的方法会增加增加一个ACC_SYNCHRONIZED
标识,该标识会指明该方法是一个同步方法。当JVM在执行有ACC_SYNCHRONIZED
标识的同步方法时, 会按照同步的策略进行调用