无名商城论坛

搜索
查看: 305|回复: 0

[其他技术] 【HC】Java中的13个原子操作类介绍

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32464
发表于 2022-5-8 18:37:14 | 显示全部楼层 |阅读模式

一、引言
在 JDK1.5 中新增 java.util.concurrent(J.U.C) 包,它建立在 CAS 之上。CAS 是非阻塞算法的一种常见实现,相对于 synchronized 这种阻塞算法,它的性能更好。

DK1.5 中引入了底层的支持,在 int、long 和对象的引用等类型上都公开了 CAS 的操作,并且 JVM 把它们编译为底层硬件提供的最有效的方法,在运行 CAS 的平台上,运行时把它们编译为相应的机器指令。在 java.util.concurrent.atomic 包下面的所有的原子变量类型中,比如 AtomicInteger,都使用了这些底层的JVM支持为数字类型的引用类型提供一种高效的 CAS 操作。

二、Java原子类介绍
?atomic 包中的 13 个类,属于 4 种类型的原子更新方式.

(1)原子更新基本类型

(2)原子更新数组

(3)原子更新引用

(4)原子更新属性

atomic 包里的类基本都是使用 Unsafe 实现的包装类.

1.原子更新基本类型
AtomicBoolean:原子更新布尔类型。
AtomicInteger:原子更新整型。
AtomicLong:原子更新长整型。
本类以 AtomicInteger 进行讲解:

AtomicInteger 是一个支持原子操作的 Integer 类,就是保证对 AtomicInteger 类型变量的增加和减少操作是原子性的,不会出现多个线程下的数据不一致问题。如果不使用 AtomicInteger,要实现一个按顺序获取的 ID,就必须在每次获取时进行加锁操作,以避免出现并发时获取到同样的 ID 的现象。

int addAndGet(int delta) 以原子方式将输入的数值与实例中的值相加,并返回结果;
boolean compareAndSet(int expect, int update) 如果输入的数值等于预期值,则以原子的方式将该值设置为输入的值;
int getAndIncrement() 以原子方式将当前值加 1,注意,这里返回的是自增前的值;
void lazySet(int newValue) 最终会设置成 newValue,使用 lazySet 设置值后,可能导致其他线程在之后的一小段时间内还是可以读到 旧值;
int getAndSet(int newValue) 以原子方式设置为 newValue 的值,并返回旧值。
那么getAndIncrement 是如何实现原子操作的呢?
我们可以看到,它的实现原理是死循环 + CAS。

2.原子更新数组
通过原子的方式更新数组里的某个元素,Atomic 包提供了以下 3 个类。

AtomicIntegerArray:原子更新整型数组里的元素。
AtomicLongArray:原子更新长整型数组里的元素。
AtomicReferenceArray:原子更新引用类型数组里的元素。
AtomicIntegerArray 类提供方法如下:

int addAndGet(int i, int delta) 以原子方式将输入值与数组中的索引 i 的元素相加
boolean compareAndSet(int i, int expect, int update) 如果当前值等于预期值,则以原子方式将数组位置 i 的元素设置成 update 值.
3.原子更新引用类型
原子更新基本类型的 AtomicInteger,只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类。Atomic 包提供了以下 3 个类。

AtomicReference:原子更新引用类型。
AtomicReferenceFieldUpdater:原子更新引用类型里的字段。
AtomicMarkableReference:原子更新带有标记位的引用类型。
4.原子更新属性
如果需原子地更新某个类里的某个字段时,就需要使用原子更新字段类,Atomic 包提供了以下 3 个类进行原子字段更新。

AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。
AtomicLongFieldUpdater:原子更新长整型字段的更新器。
AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表