码迷,mamicode.com
首页 > 其他好文 > 详细

原子变量类

时间:2018-05-29 18:57:27      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:stat   next   reference   expec   利用   bool   use   .com   volatile   

原子变量类(例如java.util.concurrent.atomic中的AtomicXxx)中使用了这些底层的JVM支持为数字类型和引用类型提供了一种高效的CAS操作,而在java.util.concurrent中的大多数类在实现时则直接或间接的使用了这些原子变量类。

 

五、原子变量类

共有12个原子变量类,可分为4组:

  • 普通原子变量类(标量类:Scalar)(4个):AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference
  • 数组原子变量类(3个):AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray
  • 复合原子变量类(2个):AtomicMarkableReference, AtomicStampedReference
  • 更新器类(3个):AtomicIntegerFieldUpdate,  AtomicLongFieldUpdate,  AtomicReferenceFieldUpdate

普通原子变量类,分别对应boolean, int,  long, object的原子操作

数组原子变量类,是普通原子变量的数组版,能够完成对数组中元素的原子操作。主要的方法和普通原子类型类似

复合原子变量类,AtomicReference的功能增强版,AtomicMarkableReference能够把引用跟一个boolean绑定,AtomicStampedReference能够把引用和一个int型的版本号绑定来完毕时间戳的功能。

更新器类,域更新器是一种优化手段,它提供了现有volatile域的一种基于反射的视图。从而能对现有volatile域进行CAS操作。我们知道volatile字段仅仅保证可见性,可是不保证原子性,
假设要想对volatile字段进行CAS操作。就要用到域更新器。它的优点是能够让volatile字段具备原子变量的能力,而不须要实际创建这么多的原子变量,毕竟volatile比起原子变量来说还是轻量级的。
域更新器没有提供对外的构造函数,它须要利用工厂方法的方式来创建。提供一个newUpdater(xxx)方法来返回一个新建的域更新器对象。

下面是AtomicInteger中的getAndIncrement()的实现。(基于Jdk1.7)

    // setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset; 
    
    public final int get() {
        return value;
    }
    
    public final int getAndIncrement() {
        //重试直至成功
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return current;
        }
    }
    
    /***使用CAS来更新****/
    public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

代码表明:AtomicInteger在做自增(++)操作时,使用底层的CAS来保证对变量的更新。用for循环则是自旋操作,保证CAS失败后不断重试直到成功,所以说CAS是无阻塞的。

其中,compareAndSwapInt是一个JNI操作,基于CAS指令来实现的。

 

原子变量类

标签:stat   next   reference   expec   利用   bool   use   .com   volatile   

原文地址:https://www.cnblogs.com/rouqinglangzi/p/9106255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!