美文网首页
五、原子类

五、原子类

作者: 小绵羊你毛不多 | 来源:发表于2018-08-21 16:45 被阅读0次

原子类

为什么要用原子类

  • 在volatile中提到,它是不能保证num++这种符合类操作的原子性问题。
  • 只能用锁机制去解决,但是原子类更精巧轻量,性能开销更小。

原理

CAS(Compare-and-Swap)

  • CAS包含三个操作数
    • 内存值 V
    • 预估值 A
    • 更新值 B

当且仅当V==A时,V讲被赋值为B,否则循环判断V是否与A相等

  • ABA问题
    • 同时用m、n线程同时取出值为A,然后n更新成B,然后又更新成A,这时候m线程一样可以更新成功!但是中间这个值已经被更新过两次
    • 如果链表的头在变化了两次后,恢复了原值,不代表链表就没有变化。

Atomic包主要提供四种原子更新方式

  1. 更新基本类型
    • AtomicInteger、AtomicBoolean、AtomicLong
  • AtomicInteger
public class AtomicInteger extends Number implements java.io.Serializable {
     private static final Unsafe unsafe = Unsafe.getUnsafe();
     
     public final int incrementAndGet() {
     //为什么返回的时候 要再一次+1?看下面这个方法的返回值就知道了
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }
}
    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
        //获取原来的值
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
//这里返回的是var5,也就是原来的值,更新后的值是var5+var4
        return var5;
    }
// 是一个native方法 
    public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
  1. 更新数组
  • AtomicIntegerArray
  • AtomicLongArray
  • AtomicReferenceArray
  1. 更新引用
  • AtomicReference
  • AtomicReferenceFieldUpdater 更新引用类型里的字段
  • AtomicMarkableReference 更新带有标记位的引用类型
  1. 更新字段
  • AtomicIntegeFieldUpdater
  • AtomicLongFieldUpdater
  • AtomicStampedReference 更新引用类型,带有版本号,解决ABA的问题。

相关文章

  • 五、原子类

    原子类 为什么要用原子类 在volatile中提到,它是不能保证num++这种符合类操作的原子性问题。 只能用锁机...

  • 子类对象之间的强转

    本文原链接:子类对象之间的强转--EOF--

  • 组合继承,寄生组合继承,class继承

    组合继承 说明:核心是在子类的构造函数中通过 Parent.call(this) 继承父类的属性,然后改变子类的原...

  • python类进阶20160707

    继承 instance.class #查看实例所属的类在子类中可以重写父类的方法(名称相同),那么在子类里,父类原...

  • CALayer子类五、CAEmitterLayer

    简介 CAEmitterLayer是一个高性能的粒子引擎,被用来创建实时例子动画如:烟雾,火,雨等等这些效果。 属...

  • 继承

    原型链式继承 优点:父类新增原型属性和方法,子类都能访问缺点:无法实现多继承;创建子类实例,无法向父类传参;来自原...

  • (五)子类实例化过程

    在子类的构造函数中,必须调用父类的构造函数当你不写的时候, 编译器默认给你调用super();(父类的无参构造函数...

  • 子类 HttpResponseRedirect|| 子类 J

    子类 HttpResponseRedirect 重定向,服务器端跳转  构造函数的第一个参数用来指定重定向的地...

  • 十二原

    十二原第六 五脏有六腑,六腑有十二原。 十二原者,出于四关。 四关主治五脏,五脏有疾,当取之十二原。 十二原者,五...

  • 分类(Category)

    概念 Category是基于原类进行扩展。虽然用子类也可以实现,但是Category更方便。 优点 将类的实现写个...

网友评论

      本文标题:五、原子类

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