1. Atomic :java.util.concurrent.atomic 基于CAS实现
(1). 基本类型原子类(AtomicInteger、AtomicBoolean、AtomicLong)
(2). 数组类型原子类 (AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray)
(3). 引用类型原子类 (AtomicReference、AtomicStampedReference、AtomicMarkableReference)
(4). 对象的属性修改原子类 (AtomicIntegerFieldUp dater、AtomicLongFieldUpdater、AtomicRefere nceFieldUpdater)
(5). 原子操作增强类(DoubleAccumulator 、DoubleAdder 、LongAccumulator 、LongAdder)
(6). 第17位罗汉:Striped64 第18位罗汉: Number
·AtomicBoolean:原子更新布尔类型。
·AtomicInteger:原子更新整型。
·AtomicLong:原子更新长整型。
·AtomicIntegerArray:原子更新整型数组里的元素。
·AtomicLongArray:原子更新长整型数组里的元素。
·AtomicReferenceArray:原子更新引用类型数组里的元素。
·AtomicIntegerArray类主要是提供原子的方式更新数组里的整型
·AtomicReference:原子更新引用类型。
·AtomicReferenceFieldUpdater:原子更新引用类型里的字段。
·AtomicMarkableReference:原子更新带有标记位的引用类型。
·AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。
·AtomicLongFieldUpdater:原子更新长整型字段的更新器。
·AtomicStampedReference:原子更新带有版本号的引用类型。
2. 基本类型原子类
①. 常用API简介
②. AtomicInteger解决 i++ 多线程下不安全问题
③. AtomicBoolean可以作为中断标识停止线程的方式
3. 数组类型原子类
4. 引用类型原子类
①.使用AtomicReference来实现自旋锁案例
②. AtomicStampedReference 解决ABA问题:通过版本号,解决修改过几次
③. AtomicMarkableReference 不建议用它解决ABA问题:通过标志位,解决是否修改
5. 对象的属性修改原子类
是什么:更细粒度的原子更新,精细到字段(某个类的某个字段)。
锁对象 -> 锁变量;比喻:全身麻醉 -> 局部麻醉
目的:以一种线程安全的方式操作非线程安全对象内的某些字段。以达到精确加锁+节约内存的目的。
使用要求:更新的对象属性必须使用public volatile修饰符;因为对象的属性修改类型原子类都是抽象类,所以每次使用都必须使用静态方法newUpdater( )创建一个更新器,并且需要设置想要更新的类和属性
考点:你在哪里用到了volatile:
单例设置模式(双端检锁机制)
AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater
6. 原子操作增强类
AtomicLong的底层是CAS+自旋锁的思想,适用于低并发的全局计算,高并发后性能急剧下降,原因如下:N个线程CAS操作修改线程的值,每次只有一个成功过,其他N-1失败,失败的不停的自旋直到成功,这样大量失败自旋的情况,一下子cpu就打高了(AtomicLong的自旋会成为瓶颈)
在高并发的情况下,我们使用LoadAdder,LoadAdder可以化整为零,分散热点,多个Cell进行CAS
AtomicLong和LongAdder的分别: