16.Atomic原子类体系概览

简介: 16.Atomic原子类体系概览

老王:小陈啊,从今天开始我们就要进入Atomic原子类系列的学习了,首先啊给你看一下JDK中提供给我们使用的原子类有哪些?

小陈:好啊,我记得JUC下面提供的原子类还是挺多的,所有的原子类的使用和底层实现的原理都全部要掌握吗?

老王:其实啊,JUC包下提供的原子类底层的实现原理基本都是差不多的,都是基于volatile和CAS操作来保证线程安全的,我们只需要掌握常用的一些原子类就可以了。

老王:至于这些原子类底层实现的原理,我们挑选几个比较有代表性的来讲,深入到源码级别,以及底层实现的细节;理解了我们讨论的这几个,你再去看其它的几个实现,发现都是一样的套路。

老王:哎呀,废话多了,不多说了,直接给你看下JUC给我哪些原子类:

image.png

看上面的图形,我们使用红色圈中的那些,就是我们需要讨论的,一共分为一下几个类别:

(1)AtomicInteger、AtomicLong整型的原子类

如果我们在程序中使用了基本的Integer、Long等类型,进行基本的数学加减运算、赋值操作等。但是如果是在多线程环境下多个线程同时操作同一个Integer、Long变量,可能导致线程安全的问题。

规避线程安全的问题,你可能需要用到锁,比如常用的synchronized、ReentrantLock锁等,让同一时间只有一个线程操作变量;但是锁是一个比较重的操作,可能导致线程获取不到锁而陷入沉睡,这样就会导致并发的性能降低。

然而如果你需要很高的并发性能,不想用锁但需要是线程安全的;在这种情况下JUC就为我们提供了线程安全的原子类AtomicInteger、AtomicLong等,在多线程环境下进行加减运算、赋值操作等都是线程安全的。

AtomicInteger、AtomicLong使用非常广泛,比如你的系统里面可能用到一些统计、计数场景比如每秒访问的流量、注册中心每秒接收到注册的次数、心跳的次数、可以使用这两个原子类。在一些开源的分布式系统、中间件系统里面,大量的metric指标统计的功能都是基于AtomicInteger、AtomicLong这两个原子类去实现的,非常重要。

image.png

(2)AtomicBoolean 布尔类型的原子类

在多线程环境下我们使用基本的booleanBoolean类型的布尔变量是非线程安全的,JUC提供类线程安全的布尔类型原子类AtomicBoolean。AtmoicBoolean 通常使用的场景是一些状态标识,比如初始化标识、系统关闭标识、逻辑状态判断标识、状态开关等等。

此外AtomicBoolean 还经常使用做非常轻量级的锁,比如阿里开源的分布式消息中间件RocketMQ就使用了AtomicBoolean封装了一个自旋锁,具有非常高的并发性能。(CAS将AtomicBoolean设置成true表示获取到了锁,释放锁的时候CAS操作将AtomicBoolean设置为false

(3)AtomicReference、AtomicStampReference可以封装对象的原子类

上面的提供的AtomicInteger、AtomicLong、AtomicBoolean等都是基本类型对应的原子类;但是如果你共享的是一个对象呢?多个线程同时修改一个对象呢? 在不使用锁的场景下可以将对象使用AtomicReference进行包装,然后CAS的去修改对象,也可以达到线程安全的效果。

AtomicStampReference 则是AtomicReference的升级版本,提供版本号机制,解决CAS中经典的ABA问题

(5)LongAdder原子类

是AtomicLong原子类的一个升级版本,在并发竞争非常激烈的时候可能会导致大量的线程CAS失败而不断自旋,而LongAdder采用分段锁的思想,在并发竞争非常激烈的时候使得不同的线程去竞争不同的锁;这样就可以减少对同一个锁的竞争,优化了并发的性能。

小陈:哇塞,原子类还有这么多分类啊,厉害了...,老王啊,我们从哪里开始学,我等不及了,等我学完回去大展拳脚......

老王:小陈啊,我们本章的主题是概览,我们先大概了解一下Atomic的类体系、我们需要掌握哪些、分为哪些类等,具体的学习我们留到后面的讨论......

小陈:这样啊,那我先预习预习,明天等你来讲...

老王:好,本篇那就先到这里......

小陈:好的,我们下一章见。

相关文章
|
8月前
|
监控 Java 测试技术
阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势
阿里云推出 3.x Java 探针,解锁应用观测与治理的全新姿势
174387 17
|
6月前
|
弹性计算 Prometheus Cloud Native
可观测性体系问题之ECS管控中重点指标的定义如何解决
可观测性体系问题之ECS管控中重点指标的定义如何解决
37 4
|
6月前
|
弹性计算 运维
可观测性体系问题之ECS管控中覆盖软件开发生命周期如何解决
可观测性体系问题之ECS管控中覆盖软件开发生命周期如何解决
32 0
|
6月前
|
中间件 Java 数据库连接
开发与运维应用问题之异步初始化bean风险如何解决
开发与运维应用问题之异步初始化bean风险如何解决
|
8月前
|
JavaScript Java 测试技术
基于Java的企业人才管理与测评系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的企业人才管理与测评系统的设计与实现(源码+lw+部署文档+讲解等)
55 0
|
8月前
|
JavaScript Java 测试技术
基于Java的游戏资源管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的游戏资源管理系统的设计与实现(源码+lw+部署文档+讲解等)
71 0
|
8月前
|
编译器 C# 开发工具
C# 12 中新增的八大功能你都知道吗?
C# 12 中新增的八大功能你都知道吗?
112 4
|
安全 数据处理 数据安全/隐私保护
数据安全最佳实践(7):通过多级安全分类构建业务安全体系【Dataphin V3.11】
在DataphinV3.11版本中,我们支持了构建多级安全分类体系的能力,用于支持客户定制和使用行业化的数据分类分级体系。 同时我们支持了识别特征的管理,可以使用内置的手机、姓名等识别特征;也在安全模型中内置了通用行业模型,便于客户直接应用,实现对大部分个人敏感数据和部分业务数据的识别和保护。
965 1
|
移动开发 Java 编译器
Java9的功能特性概览
以下是一些Java 9的功能特性
82 0
|
测试技术 数据安全/隐私保护 索引
DAO社区治理系统模式开发规则详情 | DAO社区治理系统开发源码示例(Python语言版)
DAO(Data Access Object)社区治理模式是一种去中心化的社区治理模式,它将权力下放到社区中,让社区成员自主决策、自我管理,从而实现社区的自主治理。在DAO社区治理模式中,权力下放到社区中,社区成员可以自由地发表自己的意见和建议,并且能够直接参与到社区的决策过程中。

热门文章

最新文章