首页 未命名正文

linux编程_Java并发编程之CAS

云返利网 未命名 2020-05-26 09:08:14 16 0

CAS(Compare and swap)对照和替换是设计并发算法时用到的一种手艺。简朴来说,对照和替换是使用一个期望值和一个变量的当前值举行对照,若是当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。这听起来可能有一点庞大然则实际上你明白之后发现很简朴,接下来,让我们跟深入的领会一下这项手艺。

CAS的使用场景
在程序和算法中一个经常泛起的模式就是“check and act”模式。先检查后操作模式发生在代码中首先检查一个变量的值,然后再基于这个值做一些操作。下面是一个简朴的示例:

01 class MyLock {

02 

03    private boolean locked = false;

04 

05    public boolean lock() {

06        if(!locked) {

07            locked = true;

08            return true;

09        }

10        return false;

11    }

12 }

上面这段代码,若是用在多线程的程序会泛起许多错误,不外现在请忘记它。

如你所见,lock()方式首先检查locked>成员变量是否即是false,若是即是,就将locked设为true。

若是同个线程接见同一个MyLock实例,上面的lock()将不能保证正常事情。若是一个线程检查locked的值,然后将其设置为false,与此同时,一个线程B也在检查locked的值,又或者,在线程A将locked的值设为false之前。因此,线程A和线程B可能都看到locked的值为false,然后两者都基于这个信息做一些操作。

为了在一个多线程程序中优越的事情,”check then act” 操作必须是原子的。原子就是说”check“操作和”act“被当做一个原子代码块执行。不存在多个线程同时执行原子块。

下面是一个代码示例,把之前的lock()方式用synchronized关键字重组成一个原子块。

01 class MyLock {

02 

03    private boolean locked = false;

04 

05    public synchronized boolean lock() {

06        if(!locked) {

07            locked = true;

08            return true;

09        }

10        return false;

11    }

12 }

现在lock()方式是同步的,以是,在某一时刻只能有一个线程在同一个MyLock实例上执行它。

原子的lock方式实际上是一个”compare and swap“的例子。

CAS用作原子操作
现在CPU内部已经执行原子的CAS操作。Java5以来,你可以使用java.util.concurrent.atomic包中的一些原子类来使用CPU中的这些功效。

下面是一个使用AtomicBoolean类实现lock()方式的例子:

1 public static class MyLock {

2    private AtomicBoolean locked = new AAtomicBoolean(false);

4    public boolean lock() {

5        return locked.compareAndSet(false, true);

6    }

8 }

locked变量不再是boolean类型而是AtomicBoolean。这个类中有一个compareAndSet()方式,它使用一个期望值和AtomicBoolean实例的值对照,和两者相等,则使用一个新值替换原来的值。在这个例子中,它对照locked的值和false,若是locked的值为false,则把修改为true。
若是值被替换了,compareAndSet()返回true,否则,返回false。

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)