1. 基本类型原子类
AtomicInteger、
AtomicLong、
2. 数组类型原子类
AtomicIntegerArray、
3. 引用类型原子类
AtomicReference、
AtomicStampedReference version号,+1 解决修改过几次
AtomicMarkableReference 一次,false,true 解决是否修改过
面试:CAS --- Unsafe --- do while + ABA --- AtomicStampedReference,AtomicMarkableReference
4. 对象的属性修改原子类
AtomicIntegerFieldUpdater、
AtomicLongFieldUpdater、
AtomicReferenceFieldUpdater
1)使用目的:
以一种线程安全的方式操作非线程安全对象内的某些字段。
2)使用要求:
更新的对象属性必须使用 public volatile 修饰符;
因为对象的属性修改类型原子类都是抽象类,所以每次使用都必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性
面试:你在哪里用了volatile? --- AtomicIntegerFieldUpdater
5. 原子操作增强类(jdk8+)
DoubleAccumulator
DoubleAdder
LongAccumulator
LongAdder
6. LongAdder
常用API
LongAdder只能用来计算加法,且从零开始计算。
LongAccumulator提供了自定义的函数操作。
性能对比:
---costTime: 455 ms clickBySynchronized: 50000000
---costTime: 934 ms clickByAtomicLong: 50000000
---costTime: 95 ms clickByLongAdder: 50000000
---costTime: 80 ms clickByLongAccumulator: 50000000
7. LongAdder为什么这么快?
Striped64
Cell
Striped64 比较重要的成员函数
Striped64 最重要两个
Striped64 一些变量或者方法的定义
AtomicLong vs LongAdder
LongAdder快的原因(一句话):
base变量和cell数组
数学表达
8.LongAdder 源码分析
longAdder.increment()
- add(1L)
- longAccumulate
- sum