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只是为了帮助大家理解,并不是底层的实现就是它们。

posted @ 2022-04-18 14:23  养诚  阅读(44)  评论(0编辑  收藏  举报