JUC之Atomic
基本类型有AtomicBoolean 、 AtomicInteger 、AtomicLong、这 3 个类提供的方法几乎一模一样
包中类分为五种:
基本类型:
- AtomicBoolean:布尔型原子类
- AtomicInteger:整型原子类
- AtomicLong:长整型原子类
数组:
- AtomicIntegerArray:整形数组原子类
- AtomicLongArray:长整形数组原子类
- AtomicReferenceArray:引用类型数组原子类
引用类型:
- AtomicReference:引用类型原子类
- AtomicStampedRerence:原子更新引用类型里的字段原子类
- AtomicMarkableReference:原子更新带有标记位的引用类型
对象的属性:
- AtomicIntegerFieldUpdater:原子更新整形字段的更新器
- AtomicLongFieldUpdater:原子更新长整形字段的更新器
- AtomicReferenceFieldUpdater:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题
AtomicLong 的常用方法如下
方法名 | 说明 |
---|---|
long getAndIncrement() | 以原子方式将当前值加1,注意,返回的是旧值。(i++) |
long incrementAndGet() | 以原子方式将当前值加1,注意,返回的是新值。(++i) |
long getAndDecrement() | 以原子方式将当前值减 1,注意,返回的是旧值 。(i–) |
long decrementAndGet() | 以原子方式将当前值减 1,注意,返回的是旧值 。(–i) |
long addAndGet(int delta) | 以原子方式将输入的数值与实例中的值(AtomicLong里的value)相加,并返回结果 |
long getAndSet(int newValue) | 以原子方式设置为newValue的值,并返回旧值 |
long get() | 获取 AtomicLong 中的值(value) |
boolean compareAndSet(int expect,int update) | 如果输入的数值等于预期值,则以原子方式将该值设置为输入的值。 |
void lazySet(int newValue) | 最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。 |
… | … |
JDK 1.8 新增 | |
long getAndUpdate(LongUnaryOperator updateFunction) | 定函数的结果原子更新当前值,返回上一个值。 |
long updateAndGet(LongUnaryOperator updateFunction) | 使用给定函数的结果原子更新当前值,返回更新的值。 该功能应该是无副作用的,因为尝试的更新由于线程之间的争用而失败时可能会被重新应用。 |
i++、++i、i--、--i只是为了帮助大家理解,并不是底层的实现就是它们。