JDK源码——Atomic包(一)

包介绍

JDK的atomic包提供了一组原子类,用于多线程环境中的原子操作,确保线程安全和高性能

Atomic包是Java在并发编程中的重要工具,它利用CAS(Compare-And-Swap)机制保证操作的原子性,同时避免了重量级锁的使用,提高了并发性能。Atomic包中的类通过底层处理器提供的原子指令实现,但不同的CPU架构可能提供的原子指令不同,有时可能需要某种形式的内部锁,因此不能绝对保证线程不被阻塞。
在这里插入图片描述

基本类型

AtomicInteger

提供了一种线程安全的方式来操作整数。
在这里插入图片描述
主要提供了以下方法:
在这里插入图片描述

  1. getAndIncrement(): 获取当前值并自增,返回旧值。
  2. get(): 获取当前值。
  3. compareAndSet(int expect, int update): 如果当前值等于预期值(expect),则将其更新为新的值(update)。如果更新成功,返回 true;否则返回 false。
  4. getAndSet(int newValue): 获取当前值并设置为指定的新值,返回旧值。
  5. floatValue(): 将当前值转换为 float 类型。
  6. getAndAdd(int delta): 获取当前值并加上指定的增量(delta),返回旧值。
  7. getAndUpdate(IntUnaryOperator updateFunction): 获取当前值并应用给定的一元操作函数(updateFunction),返回旧值。
  8. intValue(): 将当前值转换为 int 类型。
  9. getAndAccumulate(int x, IntBinaryOperator accumulatorFunction): 获取当前值并与给定的值(x)应用二元操作函数(accumulatorFunction),返回旧值。
  10. toString(): 返回当前值的字符串表示形式。
  11. lazySet(int newValue): 设置当前值为指定的新值,但不保证立即可见性,可能会延迟到下一次访问。
  12. incrementAndGet(): 自增并返回新值。
  13. accumulateAndGet(int x, IntBinaryOperator accumulatorFunction): 与给定的值(x)应用二元操作函数(accumulatorFunction)并返回结果。
  14. decrementAndGet(): 自减并返回新值。
  15. longValue(): 将当前值转换为 long 类型。
  16. addAndGet(int delta): 增加指定的增量(delta)并返回新值。
  17. doubleValue(): 将当前值转换为 double 类型。
  18. weakCompareAndSet(int expect, int update): 类似于 compareAndSet,但如果当前值不等于预期值,它可能不会立即失败,而是尝试再次进行比较和设置。这在某些情况下可以提高性能,但可能导致不一致的结果。
  19. updateAndGet(IntUnaryOperator updateFunction): 应用给定的一元操作函数(updateFunction)并返回结果。
  20. set(int newValue): 设置当前值为指定的新值。

原理

  1. 原子性操作:AtomicInteger使用CAS(比较替换)算法来实现其内部的值的原子性更新。CAS算法是硬件级别的原子操作,它可以在没有锁的情况下进行线程安全的更新。

  2. Unsafe类:AtomicInteger的内部实现使用了Unsafe类的native方法,如compareAndSwapInt,这是一个底层的、高效的原子操作方法,它直接与操作系统和硬件交互,实现了原子性的保证。

/**
通过调用Unsafe.getUnsafe()方法获取Unsafe实例。Unsafe类提供了一些底层操作,可以直接访问对象和内存,绕过了Java的安全检查机制。

定义了一个静态常量valueOffset,用于存储字段"value"在内存中的偏移量。

在静态初始化块中,使用unsafe.objectFieldOffset方法获取字段"value"的偏移量。这个方法需要一个Field对象作为参数,因此需要先通过反射获取AtomicInteger类的"value"字段。

如果获取偏移量的过程中发生异常(例如找不到字段),则抛出一个Error。

**/
  private static final Unsafe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

庄隐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值