zoukankan      html  css  js  c++  java
  • CAS--CompareAndSwap原理

    1.CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。

    CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。

    CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。

    2.举个例子:

     1 public class CompareAndSwap {
     2     private static AtomicInteger a=new AtomicInteger(0);
     3     private static void increase(){
     4         a.getAndIncrement();
     5     }
     6     public static void main(String[] args) {
     7         Thread[] threads=new Thread[10];
     8         for (Thread thread : threads) {
     9             thread=new Thread(new Runnable(){
    10 
    11                 @Override
    12                 public void run() {
    13                     for(int i=0;i<100;i++){
    14                         increase();
    15                     }
    16                 }
    17                 
    18             });
    19             thread.start();
    20         }
    21         while(Thread.activeCount()>1){
    22             Thread.yield();
    23             System.out.println(a);
    24         }
    25     }
    26 }
    我们可以发现,getAndIncrement方法调用getAndAddInt方法,最后调用的是compareAndSwapInt方法。
    Atomic修饰的类可以保证变量的原子性,可以实现同步。

    3.CAS的缺点:
    CAS虽然很高效的解决了原子操作问题,但是CAS仍然存在三大问题。

    循环时间长开销很大。
    只能保证一个共享变量的原子操作。
    ABA问题。


    循环时间长开销很大:
    我们可以看到getAndAddInt方法执行时,如果CAS失败,会一直进行尝试。如果CAS长时间一直不成功,可能会给CPU带来很大的开销。

    只能保证一个共享变量的原子操作:
    当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁来保证原子性。

    什么是ABA问题?ABA问题怎么解决?
    如果内存地址V初次读取的值是A,并且在准备赋值的时候检查到它的值仍然为A,那我们就能说它的值没有被其他线程改变过了吗?

    如果在这段期间它的值曾经被改成了B,后来又被改回为A,那CAS操作就会误认为它从来没有被改变过。这个漏洞称为CAS操作的“ABA”问题。Java并发包为了解决这个问题,提供了一个带有标记的原子引用类“AtomicStampedReference”,它可以通过控制变量值的版本来保证CAS的正确性。因此,在使用CAS前要考虑清楚“ABA”问题是否会影响程序并发的正确性,如果需要解决ABA问题,改用传统的互斥同步可能会比原子类更高效。
    ---------------------
    原文:https://blog.csdn.net/v123411739/article/details/79561458 

    
    
    
  • 相关阅读:
    【Python】数据写入Excel(封装后)
    【Charles】设置代理后 手机无法上网
    【Python】随机数/随机值
    【Python】操作JSON
    【Python】补零 不足位数补零
    【python】+操作yaml文件
    【Python】格式化输出JSON
    【Python】+系列教程(1、封装)
    【Python】+系列教程(总)
    【数据分析】+【Python】+股票数据分析
  • 原文地址:https://www.cnblogs.com/xc-chejj/p/10552876.html
Copyright © 2011-2022 走看看