对象更新
AtomicReference
允许你原子地更新一个引用类型的变量。这意味着在多线程环境下,你可以安全地更新这个引用,而不会导致不一致或者竞态条件的问题。它通常用于实现简单的并发数据结构,如原子计数器、状态标志等。
AtomicReference<V>
是一个泛型类,用于实现一个线程安全的引用类型。以下是各个方法的作用:
compareAndSet(V expect, V update)
: 如果当前引用等于预期值(expect),则将其设置为新值(update)。如果成功,返回 true;否则返回 false。get()
: 获取当前引用的值。weakCompareAndSet(V expect, V update)
: 如果当前引用等于预期值(expect),则将其设置为新值(update)。这个方法是非阻塞的,即使失败也不会抛出异常。getAndSet(V newValue)
: 将当前引用设置为新值(newValue),并返回旧值。accumulateAndGet(V x, BinaryOperator<V> accumulatorFunction)
: 对当前引用应用给定的二元操作函数(accumulatorFunction),并将结果存储在当前引用中,最后返回结果。lazySet(V newValue)
: 将当前引用设置为新值(newValue),但不立即刷新缓存,而是在下次访问时才更新。toString()
: 返回表示当前引用内容的字符串。set(V newValue)
: 将当前引用设置为新值(newValue)。getAndUpdate(UnaryOperator<V> updateFunction)
: 获取当前引用的值,对其应用给定的一元操作函数(updateFunction),并将结果存储在当前引用中,最后返回原始值。getAndAccumulate(V x, BinaryOperator<V> accumulatorFunction)
: 对当前引用应用给定的二元操作函数(accumulatorFunction),并将结果存储在当前引用中,最后返回结果。updateAndGet(UnaryOperator<V> updateFunction)
: 对当前引用应用给定的一元操作函数(updateFunction),并将结果存储在当前引用中,最后返回更新后的值。
AtomicStampedReference
是一个扩展了AtomicReference的功能,除了可以原子地更新引用类型的变量外,还可以附加一个版本号(时间戳)。这可以用于解决ABA问题,即当多个线程尝试更新同一个引用时,可能会遇到旧的引用值被新的引用值替换回来的情况。通过使用版本号,AtomicStampedReference可以确保只有在预期的版本号下才能成功更新引用。
AtomicStampedReference<V>
是一个泛型类,用于实现一个线程安全的引用类型,同时带有版本号(stamp)。以下是各个方法的作用:
getReference()
: 获取当前引用的值。get(int[] stampHolder)
: 获取当前引用的值和版本号,并将它们分别存储在传入的数组中。compareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp)
: 如果当前引用等于预期引用且版本号等于预期版本号,则将引用设置为新引用,并将版本号设置为新版本号。如果成功,返回 true;否则返回 false。weakCompareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp)
: 类似于compareAndSet
方法,但是这个方法是非阻塞的,即使失败也不会抛出异常。set(V newReference, int newStamp)
: 将引用设置为新引用,并将版本号设置为新版本号。objectFieldOffset(Unsafe, String, Class<?>)
: 返回指定字段在对象内存中的偏移量。这个方法通常用于底层操作,不建议在常规编程中使用。getStamp()
: 获取当前引用的版本号。casPair(Pair<V> expected, Pair<V> update)
: 如果当前引用和版本号与预期的引用和版本号相等,则将引用和版本号更新为新的值。如果成功,返回 true;否则返回 false。attemptStamp(V expectedReference, int newStamp)
: 如果当前引用等于预期引用,则尝试将版本号设置为新版本号。如果成功,返回 true;否则返回 false。
累加器更新
Striped64
提供了一种将数据分散到多个单元的方法,以提高并发性能。
DoubleAccumulator
提供了一个线程安全的累加器,用于计算double类型的值。
DoubleAccumulator类是一个用于累加双精度浮点数的类,它提供了一些方法来操作和获取累加器的当前值。以下是各个方法的作用:
- get(): 返回当前累加器的值的双精度浮点数表示形式。
- floatValue(): 返回当前累加器的值的浮点数表示形式。
- writeReplace(): 在序列化时替换当前对象,以便正确地序列化。
- getThenReset(): 返回当前累加器的值并将其重置为0。
- longValue(): 返回当前累加器的值的长整型表示形式。
- intValue(): 返回当前累加器的值的整型表示形式。
- readObject(ObjectInputStream?): 从输入流中读取并恢复DoubleAccumulator对象的状态。这个方法通常在反序列化时使用。
- reset(): 重置累加器的值为0。
- doubleValue(): 返回当前累加器的值的双精度浮点数表示形式。
- toString(): 返回当前累加器的值的字符串表示形式。
- accumulate(double): 将给定的双精度浮点数值添加到累加器中。
DoubleAdder
提供了一个线程安全的累加器,用于计算double类型的值,性能比DoubleAccumulator更好。
DoubleAdder类是一个用于累加双精度浮点数的类,它提供了一些方法来操作和获取累加器的当前值。以下是各个方法的作用:
- doubleValue(): 返回当前累加器的值的双精度浮点数表示形式。
- readObject(ObjectInputStream?): 从输入流中读取并恢复DoubleAdder对象的状态。这个方法通常在反序列化时使用。
- sum(): 返回当前累加器的值。
- intValue(): 返回当前累加器的值的整型表示形式。
- reset(): 重置累加器的值为0。
- longValue(): 返回当前累加器的值的长整型表示形式。
- sumThenReset(): 返回当前累加器的值并将其重置为0。
- add(double): 将给定的双精度浮点数值添加到累加器中。
- toString(): 返回当前累加器的值的字符串表示形式。
- writeReplace(): 在序列化时替换当前对象,以便正确地序列化。
- floatValue(): 返回当前累加器的值的浮点数表示形式。
LongAccumulator
提供了一个线程安全的累加器,用于计算long类型的值。
LongAccumulator类是一个用于累加长整型值的类,它提供了一些方法来操作和获取累加器的当前值。以下是各个方法的作用:
- getThenReset(): 返回当前累加器的值并将其重置为0。
- accumulate(long): 将给定的长整型值添加到累加器中。
- writeReplace(): 在序列化时替换当前对象,以便正确地序列化。
- reset(): 重置累加器的值为0。
- doubleValue(): 返回当前累加器的值的双精度浮点数表示形式。
- longValue(): 返回当前累加器的值的长整型表示形式。
- readObject(ObjectInputStream?): 从输入流中读取并恢复LongAccumulator对象的状态。这个方法通常在反序列化时使用。
- floatValue(): 返回当前累加器的值的浮点数表示形式。
- intValue(): 返回当前累加器的值的整型表示形式。
- get(): 返回当前累加器的值。
- toString(): 返回当前累加器的值的字符串表示形式。
LongAdder
提供了一个线程安全的累加器,用于计算long类型的值,性能比LongAccumulator更好。
LongAdder类是一个用于处理并发计数的类,它提供了一种高效的方式来更新一个长整型值。以下是各个方法的作用:
- readObject(ObjectInputStream?): 从输入流中读取并恢复LongAdder对象的状态。这个方法通常在反序列化时使用。
- decrement(): 将当前值减一。
- sum(): 返回当前值。
- increment(): 将当前值加一。
- toString(): 返回当前值的字符串表示形式。
- floatValue(): 返回当前值的浮点数表示形式。
- writeReplace(): 在序列化时替换当前对象,以便正确地序列化。
- add(long): 将给定的长整型值添加到当前值。
- reset(): 重置当前值为0。
- sumThenReset(): 返回当前值并将其重置为0。
- longValue(): 返回当前值的长整型表示形式。
- intValue(): 返回当前值的整型表示形式。
- doubleValue(): 返回当前值的双精度浮点数表示形式。