volatile原理与技巧

   为什么使用volatile比同步代价更低?
  同步的代价, 主要由其覆盖范围决定,如果可以降低同步的覆盖范围,则可以大幅提升程序性能。
  而volatile的覆盖范围仅仅变量级别的。因此它的同步代价很低。
  volatile原理是什么?
  volatile的语义,其实是告诉处理器,不要将我放入工作内存,请直接在主存操作我。
  因此,当多核或多线程在访问该变量时,都将直接操作主存,这从本质上,做到了变量共享。
  

    volatile的有什么优势?
  1更大的程序吞吐量
  2更少的代码实现多线程
  3程序的伸缩性较好
  4比较好理解,无需太高的学习成本
  volatile有什么劣势?
  1、容易出问题
  2、比较难设计

 

 

  volatile运算存在脏数据问题
  volatile仅仅能保证变量可见性,无法保证原子性
  volatilerace condition示例:
   public class TestRaceCondition {    

 

 

               private volatile int i = 0;   

               public void increase() { i++; }   

               public int getValue() { return i; }   

        }

  当多线程执行increase方法时, 是否能保证它的值会是线性递增的呢?

  答案是否定的。
  原因:
  这里的increase方法,执行的操作是i++ i = i + 1
  针对i = i + 1 在多线程中的运算, 本身需要改变i的值。
  如果,i已从内存中取到最新值,但未与1进行运算,此时其他线程已数次将运算结果赋值给i.
  则当前线程结束时, 之前的数次运算结果都将被覆盖。

  即,执行100increase可能结果是 < 100.
  一般来说, 这种情况需要较高的压力与并发情况下,才会出现。

  如何避免这种情况?
  解决以上问题的方法:
  一种是操作时,加上同步。
  这种方法,无疑将大大降低程序性能, 且违背了volatile的初衷。
  第二种方式是,使用硬件原语(CAS),实现非阻塞算法
  从CPU原语上,支持变量级别的低开销同步。
  CPU原语-比较并交换(CompareAndSet),实现非阻塞算法
  什么是CAS
  cas是现代CPU提供给并发程序使用的原语操作。 不同的CPU有不同的使用规范。
  在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。
  PowerPC 处理器有一对名为加载并保留条件存储的指令,它们实现相同的目地;
  MIPS PowerPC 处理器相似,除了第一个指令称为加载链接
  CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B

    这部分我也不太懂哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值