|
|
51CTO旗下网站
|
|
移动端

1.7.5 atomic包

《Java多线程与Socket:实战微服务框架》第1章多线程基础,本书尽量采用简要和通俗易懂的方式来介绍多线程知识。本节为大家介绍atomic包。

作者:庞永华来源:电子工业出版社|2019-03-26 15:58

1.7.5 atomic包

我们已经知道volatile关键字并不能保证原子性。在并发修改单个的共享变量时,CAS是最合适的选择。Java 5提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁地进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构提供的原子指令可能不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。

atomic包提供了4种原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新字段。

. 原子更新基本类型类

原子更新基本类型类有3个:AtomicBoolean、AtomicInteger、AtomicLong。其基本用法非常简单。其他基本类型可以转换为这3种基本类型来使用。事实上AtomicBoolean也是将boolean转换成int值,再调用Unsafe的compareAndSwapInt()方法来实现的。

. 原子更新数组类

例如,AtomicIntegerArray,用于实现对“数组元素”的原子操作。要注意的是,原子更新数组类有一个构造函数需要传递一个数组作为参数。此构造函数会将该数组复制一份作为其内部数组来使用,所以通过原子更新数组类的更新,不会影响到作为参数传入的数组。请留意构造函数和方法源码。

. 原子更新引用类

原子更新基本类型类和原子更新数组类,一次都只能更新一个变量,如果想要原子地更新多个变量,就需要将这些变量声明到某个类中,再使用原子更新引用类来实现。

. AtomicReference类:AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。它可以保证多线程环境下修改对象引用时的线程安全性。

. AtomicStampedReference类:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子地更新数据和数据的版本号。这可以解决使用CAS进行原子更新时可能出现的ABA问题。其compareAndSet()方法不仅会检查当前值是否等于预期,还会检查当前的版本标志是否也与预期版本标志相同。

. AtomicMarkableReference类:原子更新带有标记位的引用类型。这里可以原子地更新一个布尔类型的标记位和引用类型。

原子更新字段类

如果我们只需要原子地更新某个对象的某个字段,可以使用原子更新字段类。

. AtomicIntegerFieldUpdater:原子更新整型字段的更新器。

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

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

注:原子更新字段类都是抽象类,每次使用时都必须使用静态方法 newUpdater() 创建一个更新器。可被原子更新的属性必须使用public volatile修饰符。


喜欢的朋友可以加入官方的读书群

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

Jenkins Pipeline可持续化集成

Jenkins Pipeline可持续化集成

优化运维流水线
共3章 | youerning

198人订阅学习

笑熬浆糊之职场那些事

笑熬浆糊之职场那些事

IT人的职场心法
共22章 | Bear_Boss

79人订阅学习

Redis运维秘籍

Redis运维秘籍

运维标配技术
共15章 | one叶孤舟

199人订阅学习

读 书 +更多

网管第一课——网络组建与管理

本书针对初级网管朋友所需掌握的网络组建和网络管理技能,以示例方式编写而成,其主要特点就是实用性和可操作性非常强。 全书共分8章,分...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客