美文网首页
AtomicInteger详解

AtomicInteger详解

作者: 梦想家图图图 | 来源:发表于2016-10-26 15:06 被阅读0次

    AtomicInteger类在java.util.concurrent.atomic包下面,类的定义如下:

    public class AtomicInteger extends Number implements java.io.Serializable
    

    我们可以看到继承了Number类,实现了相关的方法:

    public long longValue() 
    {   
     return (long)get();
    }
    public float floatValue()
     {   
     return (float)get();
    }
    public double doubleValue()
     {   
     return (double)get();
    }
    

    分析getAndSet方法
    源代码如下:

    public final int getAndSet(int newValue) 
    {    
          for (;;)   {      //for循环一直在执行
                      int current = get();      //获取当前的值
                     if (compareAndSet(current, newValue))  //新值替代旧值
                      return current;    //返回当前值
      }
    }
    

    分析getAndIncrement方法
    源代码分析:

    public final int getAndIncrement() {
            for (;;) {
                int current = get();   //获取当前值
                int next = current + 1;  //当前值加1
                if (compareAndSet(current, next))  //设置新值
                    return current;
            }
        }
    

    我们看下compareAndSet方法,设值都是通过该方法来进行的

    public final boolean compareAndSet(int expect, int update) {
            return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
        }
    

    调用了unsafe.compareAndSwapInt的方法,是一个native方法,jvm把具体的阻塞过程交给了硬件—CPU和内存,利用CPU的多处理能力,实现硬件层面的阻塞,再加上volatile变量的特性即可实现基于原子操作的线程安全。所以说,CAS并不是无阻塞,只是阻塞并非在语言、线程方面,而是在硬件层面,所以无疑这样的操作会更快更高效。

    相关文章

      网友评论

          本文标题:AtomicInteger详解

          本文链接:https://www.haomeiwen.com/subject/vngduttx.html