java 并发 原子_Java并发编程(三):12个原子操作类一网打尽

大家知道多线程更新一个变量可能得到期望之外的结果,也就是说这种更新操作是线程不安全的,而原子操作提供了一种简单高效且线程安全的更新变量的方式。下面我们介绍Java为我们提供的12个原子操作类及其使用方式。

一、原子操作更新基本类型

包含的类如下:AtomicBoolean原子更新布尔类型

AtomicInteger原子更新整型

AtomicLong原子更新长整型

由于这三个类提供的方法几乎一致,这里我们只以AtomicInteger为例进行介绍。

1.1.常用方法http://1.int addAndGet(int delta)

以原子的方式将输入的数值与实例中的值(AtomicInteger种的value)相加,并返回结果。

2.boolean compareAndSet(int expect, int update)

如果输入的值等于预期值,则以原子方式将该值设置为输入的值。

http://3.int getAndIncrement()

以原子的方式将当前值加1,注意,这里返回的是自增前的值。

4.void lazySet(int newValue)

最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。

http://5.int getAndSet(int newValue)

以原子方式设置为newValue的值,并返回旧值。

1.2.示例代码

二、原子更新数组

包含的类如下:AtomicIntegerArray原子更新整型数组里的元素。

AtomicLongArray原子更新长整型数组里的元素。

AtomicReferenceArray原子更新引用类型数组里的元素。

由于这三个类提供的方法几乎一致,这里我们只以AtomicIntegerArray为例进行介绍。

2.1.常用方法http://1.int addAndGet(int i, int delta)

以原子方式将输入值与数组中索引i的元素相加,返回新值。

http://2.int getAndSet(int i, int newValue)

以原子方式将输入值与数组中索引i的元素相加,返回旧值。

http://3.int getAndIncrement(int i)

以原子方式将数组中索引i的元素加1,返回旧值。

http://4.int getAndDecrement(int i)

以原子方式将数组中索引i的元素减1,返回旧值。

5.boolean compareAndSet(int i, int expect, int update)

如果当前值等于预期值,则以原子方式将数组位置i的元素设置为update值。

2.2.示例代码

三、原子更新引用类型

包含的类如下:AtomicReference原子更新引用类型。

AtomicReferenceFieldUpdater原子更新引用类型的字段。

AtomicMarkableReferce原子更新带有标记位的引用类型。

由于这三个类提供的方法几乎一致,这里我们只以AtomicReference为例进行介绍。

3.1.示例代码

四、原子更新属性

包含的类如下:AtomicIntegerFieldUpdater原子更新整型的字段的更新器。

AtomicLongFieldUpdater原子更新长整型字段的更新器。

AtomicStampedFieldUpdater原子更新带有版本号的引用类型。

由于这三个类提供的方法几乎一致,这里我们只以AtomicIntegerFieldUpdater为例进行介绍。

4.1.使用步骤1.因为原子更新字段类都是抽象类,每次使用的时候必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。

2.更新类的字段必须使用public volatile修饰。

4.2.示例代码

1.欢迎点赞和评论。

2.后续我会为大家提供更多Java并发编程的内容,欢迎关注我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值