Synchronize 和 volatile 的区别

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指令

posted @ 2021-04-24 19:45  守稚心  阅读(473)  评论(0编辑  收藏  举报