JDK源码——Atomic包(二)

对象参数更新

AtomicIntegerFieldUpdater

允许对指定类的实例中的int类型字段进行原子更新。这意味着在多线程环境下,你可以安全地更新这个字段,而不会导致不一致或者竞态条件的问题。

类方法说明:
在这里插入图片描述

  1. getAndUpdate(T obj, IntUnaryOperator updateFunction): 获取指定对象上的整型字段的当前值,并应用给定的一元操作函数(updateFunction)进行更新,最后返回更新前的值。
  2. decrementAndGet(T obj): 将指定对象上的整型字段减1,并返回减1后的值。
  3. newUpdater(Class<U> tclass, String fieldName): 创建一个新的 AtomicIntegerFieldUpdater 实例,用于更新指定类 tclass 中名为 fieldName 的整型字段。
  4. weakCompareAndSet(T obj, int expect, int update): 如果指定对象上的整型字段的当前值等于预期值(expect),则尝试将其更新为新值(update)。该方法可能会失败,因为它不保证立即可见性。返回一个布尔值表示是否成功更新。
  5. lazySet(T obj, int newValue): 设置指定对象上的整型字段的值为新值(newValue),但不保证立即可见性。
  6. compareAndSet(T obj, int expect, int update): 如果指定对象上的整型字段的当前值等于预期值(expect),则将其更新为新值(update)。返回一个布尔值表示是否成功更新。
  7. getAndDecrement(T obj): 获取指定对象上的整型字段的当前值,并将其减1,最后返回减1后的值。
  8. get(T obj): 获取指定对象上的整型字段的当前值。
  9. getAndSet(T obj, int newValue): 获取指定对象上的整型字段的当前值,并将其设置为新值(newValue)。返回旧值。
  10. addAndGet(T obj, int delta): 将指定的增量(delta)添加到指定对象上的整型字段,并返回结果。
  11. getAndIncrement(T obj): 获取指定对象上的整型字段的当前值,并将其自增1,最后返回自增后的值。
  12. getAndAccumulate(T obj, int x, IntBinaryOperator accumulatorFunction): 对指定对象上的整型字段进行累加操作,并返回累加后的结果。累加操作由提供的累加器函数(accumulatorFunction)定义。
  13. accumulateAndGet(T obj, int x, IntBinaryOperator accumulatorFunction): 对指定对象上的整型字段进行累加操作,并返回累加后的结果。累加操作由提供的累加器函数(accumulatorFunction)定义。
  14. incrementAndGet(T obj): 获取指定对象上的整型字段的当前值,将其自增1,然后将结果写回该位置,最后返回操作后的值。
  15. set(T obj, int newValue): 设置指定对象上的整型字段的值为新值(newValue)。
  16. getAndAdd(T obj, int delta): 获取指定对象上的整型字段的当前值,将其加上指定的增量(delta),然后将结果写回该位置,最后返回操作前的值。
  17. updateAndGet(T obj, IntUnaryOperator updateFunction): 应用给定的一元操作函数(updateFunction)到指定对象上的整型字段上,并返回操作后的值。

AtomicLongFieldUpdater

类似于AtomicIntegerFieldUpdater,但是用于更新long类型的字段。

类方法说明:
在这里插入图片描述

  1. compareAndSet(T obj, long expect, long update): 如果对象 objlong 类型字段当前值等于 expect,则将其设置为 update,并返回 true;否则返回 false
  2. isSamePackage(Class<?> class1, Class<?> class2): 判断两个类是否在同一个包内。
  3. getAndUpdate(T obj, LongUnaryOperator operator): 获取对象 objlong 类型字段的当前值,然后使用给定的操作符 operator 对其进行更新,并返回更新前的值。
  4. set(T obj, long newValue): 将对象 objlong 类型字段设置为新值 newValue
  5. get(T obj): 获取对象 objlong 类型字段的当前值。
  6. getAndSet(T obj, long newValue): 获取对象 objlong 类型字段的当前值,并将其设置为新值 newValue,最后返回旧值。
  7. getAndAccumulate(T obj, long x, LongBinaryOperator accumulatorFunction): 获取对象 objlong 类型字段的当前值,然后使用给定的累加器函数 accumulatorFunction 对其进行累加操作,并将结果写回该字段,最后返回累加前的值。
  8. weakCompareAndSet(T obj, long expect, long update): 如果对象 objlong 类型字段当前值等于 expect,则尝试将其设置为 update,但不保证立即可见性。返回一个布尔值表示是否成功更新。
  9. lazySet(T obj, long newValue): 将对象 objlong 类型字段设置为新值 newValue,但不保证立即可见性。
  10. newUpdater(Class<U> tclass, String fieldName): 创建一个新的 AtomicLongFieldUpdater<U> 实例,用于更新指定类 tclass 中名为 fieldNamelong 类型字段。
  11. incrementAndGet(T obj): 将对象 objlong 类型字段自增1,并返回自增后的值。
  12. addAndGet(T obj, long delta): 将对象 objlong 类型字段加上指定的增量 delta,并返回结果。
  13. decrementAndGet(T obj): 将对象 objlong 类型字段减1,并返回减1后的值。
  14. isAncestor(ClassLoader parent, ClassLoader child): 判断 parent 是否是 child 的祖先类加载器。
  15. getAndDecrement(T obj): 获取对象 objlong 类型字段的当前值,并将其减1,最后返回减1后的值。
  16. updateAndGet(T obj, LongUnaryOperator operator): 使用给定的操作符 operator 对对象 objlong 类型字段进行更新,并返回更新后的值。
  17. accumulateAndGet(T obj, long x, LongBinaryOperator accumulatorFunction): 对对象 objlong 类型字段进行累加操作,并返回累加后的结果。累加操作由提供的累加器函数 accumulatorFunction 定义。
  18. getAndAdd(T obj, long delta): 获取对象 objlong 类型字段的当前值,将其加上指定的增量 delta,然后将结果写回该字段,最后返回操作前的值。
  19. getAndIncrement(T obj): 获取对象 objlong 类型字段的当前值,将其自增1,然后将结果写回该字段,最后返回操作后的值。
  20. getPackageName(Class<?> clazz): 获取类 clazz 所在的包名。

AtomicReferenceFieldUpdater

与AtomicIntegerFieldUpdater和AtomicLongFieldUpdater类似,但是用于更新引用类型的字段。

类方法说明
在这里插入图片描述

  1. lazySet(T obj, V newValue): 将给定对象的字段设置为新值,但不会立即刷新缓存,而是在下次访问时才更新。
  2. getAndSet(T obj, V newValue): 获取给定对象的字段的当前值,并将其设置为新值。
  3. weakCompareAndSet(T obj, V expect, V update): 如果给定对象的字段当前值等于期望值,则将其设置为更新值。这个方法可能会失败,因为它不保证原子性。
  4. newUpdater(Class<U> tclass, Class<W> vclass, String fieldName): 创建一个新的 AtomicReferenceFieldUpdater<U, W> 实例,用于更新指定类的指定字段。
  5. getAndUpdate(T obj, UnaryOperator<V> updateFunction): 获取给定对象的字段的当前值,并使用给定的更新函数对其进行更新。
  6. compareAndSet(T obj, V expect, V update): 如果给定对象的字段当前值等于期望值,则将其设置为更新值。这个方法是原子性的。
  7. set(T obj, V newValue): 将给定对象的字段设置为新值。
  8. getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction): 获取给定对象的字段的当前值,并使用给定的累加器函数对其进行累加操作。
  9. accumulateAndGet(T obj, V x, BinaryOperator<V> accumulatorFunction): 对给定对象的字段进行累加操作,并返回累加后的值。
  10. get(T obj): 获取给定对象的字段的当前值。
  11. updateAndGet(T obj, UnaryOperator<V> updateFunction): 使用给定的更新函数对给定对象的字段进行更新,并返回更新后的值。

引用更新

AtomicMarkableReference

允许原子地更新一个引用,并且给这个引用附加一个标记。这可以用于多种场景,例如实现非阻塞的数据结构。

AtomicMarkableReference<V> 是一个泛型类,用于实现原子地更新引用和标记。它提供了一组方法来操作引用和标记,以确保在并发环境中的线程安全性。以下是各个方法的作用:

  1. casPair(Pair<V>, Pair<V>): 尝试原子地将当前引用和标记设置为给定的一对新值(一个包含新的引用和标记)。如果成功,返回 true;否则返回 false。

  2. attemptMark(V, boolean): 尝试原子地将当前引用的值设置为给定的新引用,并将标记设置为给定的新标记。如果成功,返回 true;否则返回 false。

  3. weakCompareAndSet(V, V, boolean, boolean): 比较并设置当前引用和标记的值。如果当前引用等于预期引用且当前标记等于预期标记,则将它们设置为给定的新值。这个方法是非阻塞的,即使失败也不会抛出异常。

  4. isMarked(): 返回当前引用是否被标记。

  5. get(boolean[]): 获取当前引用的值,并将当前标记存储到提供的布尔数组中。

  6. objectFieldOffset(Unsafe, String, Class<?>): 计算给定字段在对象中的偏移量。这个方法通常用于直接操作内存,需要谨慎使用。

  7. getReference(): 获取当前引用的值。

  8. compareAndSet(V, V, boolean, boolean): 比较并设置当前引用和标记的值。如果当前引用等于预期引用且当前标记等于预期标记,则将它们设置为给定的新值。这个方法是阻塞的,如果失败会抛出异常。

  9. set(V, boolean): 将当前引用的值设置为给定的新引用,并将标记设置为给定的新标记。

AtomicReferenceArray

提供了对引用数组的原子操作。你可以安全地在多线程环境下更新数组里的单个元素。
AtomicReferenceArray<E> 是一个泛型类,用于实现一个线程安全的数组,其中每个元素都是原子引用类型。以下是各个方法的作用:

  1. updateAndGet(int i, UnaryOperator<E> updateFunction): 对指定索引位置的元素应用给定的一元操作函数,并返回更新后的值。
  2. weakCompareAndSet(int i, E expectedValue, E newValue): 如果指定索引位置的元素等于预期值,则将其设置为新值。这个方法是非阻塞的,即使失败也不会抛出异常。
  3. accumulateAndGet(int i, E x, BinaryOperator<E> accumulatorFunction): 对指定索引位置的元素应用给定的二元操作函数,并将结果存储在该位置,然后返回结果。
  4. readObject(ObjectInputStream s): 从输入流中读取对象,并将其赋值给当前对象。
  5. getAndUpdate(int i, UnaryOperator<E> updateFunction): 获取指定索引位置的元素的当前值,对其应用给定的一元操作函数,并将结果存储在该位置,最后返回原始值。
  6. compareAndSetRaw(long offset, E expectedValue, E newValue): 如果指定偏移量处的元素等于预期值,则将其设置为新值。这个方法是底层方法,通常不直接使用。
  7. get(int i): 获取指定索引位置的元素的值。
  8. length(): 返回数组的长度。
  9. getRaw(long offset): 获取指定偏移量处的元素的值。这个方法是底层方法,通常不直接使用。
  10. compareAndSet(int i, E expectedValue, E newValue): 如果指定索引位置的元素等于预期值,则将其设置为新值。这个方法是阻塞的,如果失败会抛出异常。
  11. toString(): 返回表示数组内容的字符串。
  12. getAndSet(int i, E newValue): 获取指定索引位置的元素的当前值,并将其设置为新值,最后返回原始值。
  13. byteOffset(int i): 返回指定索引位置的元素在内存中的字节偏移量。
  14. checkedByteOffset(int i): 返回指定索引位置的元素在内存中的字节偏移量,如果偏移量超出范围,则抛出异常。
  15. getAndAccumulate(int i, E x, BinaryOperator<E> accumulatorFunction): 获取指定索引位置的元素的当前值,对其应用给定的二元操作函数,并将结果存储在该位置,最后返回原始值。
  16. set(int i, E newValue): 将指定索引位置的元素设置为新值。
  17. lazySet(int i, E newValue): 将指定索引位置的元素设置为新值,但不立即刷新缓存,而是在下次访问时才更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吴代庄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值