JDK源码——Atomic包(三)

对象更新

AtomicReference

允许你原子地更新一个引用类型的变量。这意味着在多线程环境下,你可以安全地更新这个引用,而不会导致不一致或者竞态条件的问题。它通常用于实现简单的并发数据结构,如原子计数器、状态标志等。

AtomicReference<V> 是一个泛型类,用于实现一个线程安全的引用类型。以下是各个方法的作用:

  1. compareAndSet(V expect, V update): 如果当前引用等于预期值(expect),则将其设置为新值(update)。如果成功,返回 true;否则返回 false。
  2. get(): 获取当前引用的值。
  3. weakCompareAndSet(V expect, V update): 如果当前引用等于预期值(expect),则将其设置为新值(update)。这个方法是非阻塞的,即使失败也不会抛出异常。
  4. getAndSet(V newValue): 将当前引用设置为新值(newValue),并返回旧值。
  5. accumulateAndGet(V x, BinaryOperator<V> accumulatorFunction): 对当前引用应用给定的二元操作函数(accumulatorFunction),并将结果存储在当前引用中,最后返回结果。
  6. lazySet(V newValue): 将当前引用设置为新值(newValue),但不立即刷新缓存,而是在下次访问时才更新。
  7. toString(): 返回表示当前引用内容的字符串。
  8. set(V newValue): 将当前引用设置为新值(newValue)。
  9. getAndUpdate(UnaryOperator<V> updateFunction): 获取当前引用的值,对其应用给定的一元操作函数(updateFunction),并将结果存储在当前引用中,最后返回原始值。
  10. getAndAccumulate(V x, BinaryOperator<V> accumulatorFunction): 对当前引用应用给定的二元操作函数(accumulatorFunction),并将结果存储在当前引用中,最后返回结果。
  11. updateAndGet(UnaryOperator<V> updateFunction): 对当前引用应用给定的一元操作函数(updateFunction),并将结果存储在当前引用中,最后返回更新后的值。

AtomicStampedReference

是一个扩展了AtomicReference的功能,除了可以原子地更新引用类型的变量外,还可以附加一个版本号(时间戳)。这可以用于解决ABA问题,即当多个线程尝试更新同一个引用时,可能会遇到旧的引用值被新的引用值替换回来的情况。通过使用版本号,AtomicStampedReference可以确保只有在预期的版本号下才能成功更新引用。

AtomicStampedReference<V> 是一个泛型类,用于实现一个线程安全的引用类型,同时带有版本号(stamp)。以下是各个方法的作用:

  1. getReference(): 获取当前引用的值。
  2. get(int[] stampHolder): 获取当前引用的值和版本号,并将它们分别存储在传入的数组中。
  3. compareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp): 如果当前引用等于预期引用且版本号等于预期版本号,则将引用设置为新引用,并将版本号设置为新版本号。如果成功,返回 true;否则返回 false。
  4. weakCompareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp): 类似于 compareAndSet 方法,但是这个方法是非阻塞的,即使失败也不会抛出异常。
  5. set(V newReference, int newStamp): 将引用设置为新引用,并将版本号设置为新版本号。
  6. objectFieldOffset(Unsafe, String, Class<?>): 返回指定字段在对象内存中的偏移量。这个方法通常用于底层操作,不建议在常规编程中使用。
  7. getStamp(): 获取当前引用的版本号。
  8. casPair(Pair<V> expected, Pair<V> update): 如果当前引用和版本号与预期的引用和版本号相等,则将引用和版本号更新为新的值。如果成功,返回 true;否则返回 false。
  9. attemptStamp(V expectedReference, int newStamp): 如果当前引用等于预期引用,则尝试将版本号设置为新版本号。如果成功,返回 true;否则返回 false。

累加器更新

在这里插入图片描述

Striped64

提供了一种将数据分散到多个单元的方法,以提高并发性能。

DoubleAccumulator

提供了一个线程安全的累加器,用于计算double类型的值。

DoubleAccumulator类是一个用于累加双精度浮点数的类,它提供了一些方法来操作和获取累加器的当前值。以下是各个方法的作用:

  1. get(): 返回当前累加器的值的双精度浮点数表示形式。
  2. floatValue(): 返回当前累加器的值的浮点数表示形式。
  3. writeReplace(): 在序列化时替换当前对象,以便正确地序列化。
  4. getThenReset(): 返回当前累加器的值并将其重置为0。
  5. longValue(): 返回当前累加器的值的长整型表示形式。
  6. intValue(): 返回当前累加器的值的整型表示形式。
  7. readObject(ObjectInputStream?): 从输入流中读取并恢复DoubleAccumulator对象的状态。这个方法通常在反序列化时使用。
  8. reset(): 重置累加器的值为0。
  9. doubleValue(): 返回当前累加器的值的双精度浮点数表示形式。
  10. toString(): 返回当前累加器的值的字符串表示形式。
  11. accumulate(double): 将给定的双精度浮点数值添加到累加器中。

DoubleAdder

提供了一个线程安全的累加器,用于计算double类型的值,性能比DoubleAccumulator更好。

DoubleAdder类是一个用于累加双精度浮点数的类,它提供了一些方法来操作和获取累加器的当前值。以下是各个方法的作用:

  1. doubleValue(): 返回当前累加器的值的双精度浮点数表示形式。
  2. readObject(ObjectInputStream?): 从输入流中读取并恢复DoubleAdder对象的状态。这个方法通常在反序列化时使用。
  3. sum(): 返回当前累加器的值。
  4. intValue(): 返回当前累加器的值的整型表示形式。
  5. reset(): 重置累加器的值为0。
  6. longValue(): 返回当前累加器的值的长整型表示形式。
  7. sumThenReset(): 返回当前累加器的值并将其重置为0。
  8. add(double): 将给定的双精度浮点数值添加到累加器中。
  9. toString(): 返回当前累加器的值的字符串表示形式。
  10. writeReplace(): 在序列化时替换当前对象,以便正确地序列化。
  11. floatValue(): 返回当前累加器的值的浮点数表示形式。

LongAccumulator

提供了一个线程安全的累加器,用于计算long类型的值。

LongAccumulator类是一个用于累加长整型值的类,它提供了一些方法来操作和获取累加器的当前值。以下是各个方法的作用:

  1. getThenReset(): 返回当前累加器的值并将其重置为0。
  2. accumulate(long): 将给定的长整型值添加到累加器中。
  3. writeReplace(): 在序列化时替换当前对象,以便正确地序列化。
  4. reset(): 重置累加器的值为0。
  5. doubleValue(): 返回当前累加器的值的双精度浮点数表示形式。
  6. longValue(): 返回当前累加器的值的长整型表示形式。
  7. readObject(ObjectInputStream?): 从输入流中读取并恢复LongAccumulator对象的状态。这个方法通常在反序列化时使用。
  8. floatValue(): 返回当前累加器的值的浮点数表示形式。
  9. intValue(): 返回当前累加器的值的整型表示形式。
  10. get(): 返回当前累加器的值。
  11. toString(): 返回当前累加器的值的字符串表示形式。

LongAdder

提供了一个线程安全的累加器,用于计算long类型的值,性能比LongAccumulator更好。

LongAdder类是一个用于处理并发计数的类,它提供了一种高效的方式来更新一个长整型值。以下是各个方法的作用:

  1. readObject(ObjectInputStream?): 从输入流中读取并恢复LongAdder对象的状态。这个方法通常在反序列化时使用。
  2. decrement(): 将当前值减一。
  3. sum(): 返回当前值。
  4. increment(): 将当前值加一。
  5. toString(): 返回当前值的字符串表示形式。
  6. floatValue(): 返回当前值的浮点数表示形式。
  7. writeReplace(): 在序列化时替换当前对象,以便正确地序列化。
  8. add(long): 将给定的长整型值添加到当前值。
  9. reset(): 重置当前值为0。
  10. sumThenReset(): 返回当前值并将其重置为0。
  11. longValue(): 返回当前值的长整型表示形式。
  12. intValue(): 返回当前值的整型表示形式。
  13. doubleValue(): 返回当前值的双精度浮点数表示形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴代庄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值