1. 在应用层面来讲
a. volatile是线程同步的轻量级实现,所以volatile的性能要比synchronize好;
volatile只能用于修饰变量,synchronize可以用于修饰方法、代码块。随着jdk技术的发展,synchronize在执行效率上会得到较大提升,所以synchronize在项目过程中还是较为常见的;
2. 多线程访问volatile不会发生阻塞;而synchronize会发生阻塞;
3. volatile能保证变量在私有内存和主内存间的同步,但不能保证变量的原子性;synchronize可以保证变量原子性;
4. volatile是变量在多线程之间的可见性;synchronize是多线程之间访问资源的同步性;
对于volatile修饰的变量,可以解决变量读时可见性问题,无法保证原子性。对于多线程访问同一个实例变量还是需要加锁同步。
2. 在底层实现来讲
1. Synchronize
a. 字节码 :使用monitorenter 和 monitorexit 指令实现
b. JVM : 使用了C和C++ 调用了操作系统的同步机制
c. OS和硬件 : 方法加了修饰符 :ACC_SYNCHRONIZED
2. volatile
a. 字节码 :被编译成了ACC_VOLATILE
b. JVM : 使用内存屏障 :loadloadBr 和loadstoreBr
c. OS和硬件 : 使用了lock指令