zoukankan      html  css  js  c++  java
  • 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指令

    为了未来有更多的选择
  • 相关阅读:
    NestingQuery
    Repeat
    GenericQuery
    StringOpr
    RHEL5.6 安装 virtualbox
    DNS的资料总结
    drop delete truncate 区别
    Linux Shell命令ulimit的用法
    OSI及TCP/IP的概念和区别
    shell:读取文件的每一行内容并输出
  • 原文地址:https://www.cnblogs.com/zhixinSHOU/p/14697876.html
Copyright © 2011-2022 走看看