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

13个原子操作类

时间:2016-07-06 00:22:37      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

自己的总结:

   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。

 

13个原子操作类

标签:

原文地址:http://www.cnblogs.com/YDDMAX/p/5645258.html

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