0
点赞
收藏
分享

微信扫一扫

synchronized和volatile的区别

得一道人 2022-03-11 阅读 68
java面试

关于synchronized的解释请参考:https://blog.csdn.net/A798194701/article/details/123053501
首先volatile 只能用来修饰变量,当一个变量被它修饰后具备如下属性:

  1. 禁止指令重排

    1. 什么是指令重排?指编译器或CPU为了优化程序的执行性能而对指令进行重新排序的一种手段,重排序会带来可见性问题,所以在多线程开发中必须要关注并规避重排序。即从源代码到指令序列的重排序。

    2. 从源代码到最终运行的指令,会经过如下两个阶段的重排序。

      第一阶段,编译器重排序,就是在编译过程中,编译器根据上下文分析对指令进行重排序,目的是减少CPU和内存的交互,重排序之后尽可能保证CPU从寄存器或缓存行中读取数据。

      第二阶段,处理器重排序,处理器重排序分为两个部分。

      • 并行指令集重排序,这是处理器优化的一种,处理器可以改变指令的执行顺序。
      • 内存系统重排序,这是处理器引入Store Buffer缓冲区延时写入产生的指令执行顺序不一致的问题

此部分参考链接

  1. 保证变量的可见性

    1. 当一个线程修改了变量值,其新值对其他线程可见。解决在多个线程之间变量不一致的问题

总结:

  1. volatile只能作用于变量,而synchronized可以作用于方法和代码块
  2. volatile只能保证变量的可见性,不能保证变量的原子性。synchronized既可以保证原子性又可以保证可见性
  3. 在多线程中,volatile 主要用于解决变量在多线程中的可见性,保证看到的变量是相同的。synchronized主要用于解决多线程之间资源的同步问题,保证在同一时刻,只有一个线程对资源进行操作
举报

相关推荐

0 条评论