AutomaticInteger中CAS运用分析

摘要

  在接触CAS的时候虽然对它流程了解了可是对其如何解决并发问题仍是一直有疑问的,因此在就选择了java中典型线程安全的AtomicInteger类进行了源码的分析。java

CAS简介

  CAS的全称为compare and swap简单的解释为比较交换,这个过程实际上是发生在内存中的,应该说是汇编语言的一个操做过程。那么乐观锁为何用CAS算法呢?简单的来讲就是乐观锁每次操做的时候都认为不会发生并发,可是为了安全仍是会去检测是否并发了,这样的话不用sync耗费太大性能算法

正文

  接下来就开始说正文。咱们先从AtomicInteger类的incrementAndGet()的方法解析吧,代码以下所示:安全

 public final int incrementAndGet() {
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
 }

  OK,这是一段很是简单的代码至于为何把它拿出来是由于我以为我有必要凑一下字数否则显的我写的第一篇文章实在是过短了。不过这里有个东西我要解释一下就是这个valueoffset,这个是AtomicInteger中被volatile关键字修饰的value在内存中的偏移量,嗯,贴个代码占点字数。并发

static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

  能够看出来这个偏移量在类加载过程当中就获得了,接下来我们点击去getAndAddInt方法内,代码以下所示:性能

public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);//1
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));//2

        return var5;
    }

  上面这段代码就是我们要说的重点了,先忽略编号为1的代码,咱们先看代号为2的代码行。方法compareAndSwapInt方法有四个参数,解释一下:学习

  var1:对象的引用;this

  var2:值的偏移量;spa

       var3:指望值;线程

       var4:更新值;code

       咱们接下来对这个方法的功能解释一下,这个方法它是一个本地方法,它底层是C++写的,里面究竟是什么你们能够在网上搜不少资料来查看,这里我我通俗的给你们说明一下。这个方法的做用就是拿着对象的引用以及位偏移量从内存中拿到值,而后拿着这个值和指望值进行一个比较,若是相同则将要更新的值放到内存中返回true若是不一样则返回false.说到这里你们可能就知道这就是一次CAS了,那如今咱们说一下编号为1的那行代码是干吗的,简单的来讲就是从内存中拿到value值(它到底底层是若是实现的你们也能够上网上搜搜)。

  好,如今咱们就开始解释一下这个方法,首先从内存中拿到value的值,而后将这个值做为compareAndSwapInt方法的指望值,而后再将对象的引用和值偏移量做为var1参数和var2参数,而后带上更新值执行compareAndSwapInt方法,以后就是等待返回true和flase而后判断时候作循环。OK讲到这里估计你们就比较清楚了,对于C++里面你是怎么保证原子性的请在百度框搜索"java cas 详解"。

总结

  怎么说?嗯,由于网上对cas的解释多的数不胜数因此就没有再去粘贴和总结那些知识点也请你们多多包涵,对于本文的问题请大伙积极指出我必定研究并修改,但愿能互相促进学习。END !

相关文章
相关标签/搜索