13个原子操作类

自己的总结:

   1、原子类的核心是循环CAS,其中CAS使用的是unsafe类里面的3种CAS。

   2、原子类共分为4类

   3、CAS会带来ABA问题,所以直接使用原子类也有ABA问题。但是使用AtomicStampedReference  可以解决这个问题。

   4、自己对CAS的理解:含义像下面的代码那样,if然后set,但是没有加锁,可以多线程同时执行。

synchanized(this){

if(param==1)
   set(2);
}

   5、原子类里面的实现value都是volatile。

   6、问题见下面的红色标记

前言:

    java.util.concurrent.atomic包里面提供的原子操作类提供了一种用法简单、简单高效、线程安全的更新一个变量的方式。

    问题:原子类的核心是循环CAS,使用了unsafe里面的CAS,为什么就高效了?

1、原子更新基本类型类(只有3个)

    AtomicInteger

   AtomicBoolean

   AtomicLong

   核心实现是使用了unsafe的循环CAS。

   unsafe也只提供了3种CAS:compareAndSwapObject,compareAndSwapInt,compareAndSwapLong

   因为原子操作类只支持3种,其他的基本类型可以使用这三个代替。

    问题:lazySet()

2、原子更新数组

  AtomicIntegerArray

   AtomicLongArray

   AtomicReferenceArray

   构造方法传入的是个数组,原子类会复制一个数组。

3、原子更新引用类型

   AtomicReference

   AtomicReferenceFieldUpdater

   AtomicMarkableReference

4、原子更新字段类

   AtomicIntegerFieldUpdater

    AtomicLongFieldUpdater

    AtomicStampedReference  可以解决CAS的ABA问题

   问题: 更新的字段为什么需要设置成volatile?

   答:原子类里面的value都是volatile的,所以此处也需要volatile。

 

posted @ 2016-07-05 22:32  YDDMAX  阅读(677)  评论(0编辑  收藏  举报