Atomic 原子类详细介绍

Atomic 原子类详细介绍

Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原子类都存放在 java.util.concurrent.atomic 下,如下图所示。

根据操作的数据类型,可以将JUC包中的原子类分为4类

基本类型

使用原子的方式更新基本类型

AtomicInteger:整型原子类

AtomicLong:长整型原子类

AtomicBoolean :布尔型原子类

数组类型

使用原子的方式更新数组里的某个元素

AtomicIntegerArray:整型数组原子类

AtomicLongArray:长整型数组原子类

AtomicReferenceArray :引用类型是数组原子类

引用类型

AtomicReference:引用类型原子类

AtomicMarkableReference:原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来,也可以解决使用 CAS 在进行原子更新时可能出现的 ABA 问题。

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

对象的属性修改类型

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

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

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

修正: AtomicMarkableReference 不能解决ABA问题

/**AtomicMarkableReference是将一个boolean值作是否有更改的标记,本质就是它的版本号只有两个,true和false,修改的时候在这两个版本号之间来回切换,这样做并不能解决ABA的问题,只是会降低ABA问题发生的几率而已

*/

public class SolveABAByAtomicMarkableReference {

private static AtomicMarkableReference atomicMarkableReference = new

AtomicMarkableReference(100, false);

public static void main(String[] args) {

Thread refT1 = new Thread(() -> {

try {

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

atomicMarkableReference.compareAndSet(100, 101,

atomicMarkableReference.isMarked(), !atomicMarkableReference.isMarked());

atomicMarkableReference.compareAndSet(101, 100,

atomicMarkableReference.isMarked(), !atomicMarkableReference.isMarked());

});

Thread refT2 = new Thread(() -> {

boolean marked = atomicMarkableReference.isMarked();

try {

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

e.printStackTrace();

}

boolean c3 = atomicMarkableReference.compareAndSet(100, 101,

marked, !marked);

System.out.println(c3); // 返回true,实际应该返回false

});

refT1.start();

refT2.start();

}

}

CAS ABA 问题

描述: 第一个线程取到了变量 x 的值 A,然后巴拉巴拉干别的事,总之就是只拿到了变量 x 的值A。这段时间内第二个线程也取到了变量 x 的值 A,然后把变量 x 的值改为 B,然后巴拉巴拉干别的事,最后又把变量 x 的值变为 A (相当于还原了)。在这之后第一个线程终于进行了变量 x 的操作,但是此时变量 x 的值还是 A,所以 compareAndSet 操作是成功。例子描述(可能不太合适,但好理解): 年初,现金为零,然后通过正常劳动赚了三百万,之后正常消费了(比如买房子)三百万。年末,虽然现金零收入(可能变成其他形式了),但是赚了钱是事实,还是得交税的!

代码例子(以 AtomicInteger 为例)

【关注】转发了解更多内容,方便后续查看

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年7月5日 18:03
下一篇 2022年7月5日 18:04

相关推荐

  • 存储过程语法(sql server存储过程语法)

    今天小编给各位分享存储过程语法的知识,其中也会对sql server存储过程语法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! oracle存储过程基本语法…

    2022年11月26日
  • 淘宝直播开通后带货链接怎么做(淘宝直播需要开通淘宝店铺吗)

    直播带货无论是对于商家来说还是主播收益都是非常可观的,所以不少平台都有直播带货功能,一些小伙伴也想加入淘宝直播,那么淘宝直播开通后带货链接怎么做?下面小编为大家带来淘宝直播开通后带…

    2022年11月24日
  • cpu性能天梯图2022 AMD CPU天梯图最新排行榜出炉

    用户在DIY自己的主机时选择CPU是非常关键的,CPU可以说是电脑的大脑,大家也都想追求好一点的CPU来使用,但型号太多了,大部分的用户都不知道目前哪一款CPU比较好用,快来看看详…

    2022年11月24日
  • 快手限流多久能解除(快手限流什么意思)

    我相信很多人都看中了快手平台的商机,都争先恐后地想要抢占机会,可一些人刚刚作出一点成绩,就被降权了,自己也不知道什么原因。所以今天就来聊聊快手账号降权操作分享,赶快来看看避免违规!…

    2022年11月23日
  • Win11 22H2再出新问题Bug:无法弹出USB设备

    作为Windows 11的首次大更新,在Win11 22H2发布后并没有带来预想的场景,各种问题频现成为了一种常态。 近日有消息称,Win11 22H2存在一个占用冲突Bug,当用…

    2022年11月22日
  • 美团月付300小额取现?美团月付取现300不见了

    很多上班族每天都在使用美团点外卖,你知道美团现在推出了一款类似花呗的产品吗?可以在美团消费的时候先消费后还款,叫做美团月付,是美团推出的一款消费型产品,不能直接提现到银行卡,只能用…

    2022年11月21日
  • AMD下一代线程撕裂者现身 最高96核192线程480MB缓存

    此前的消息表明,明年AMD就将发布下一代基于Zen 4架构的全新Ryzen Threadripper 7000“Storm Peak”处理器。现在,疑似其顶级型号(可能被称作Pro…

    2022年11月18日
  • 京东店铺类型有哪些京东入驻有什么资质要求

    今天的互联网发展迅速,让传统企业有了更多选择,但也同样也对刚触网的商家增添了许多迷茫,近日知舟电商就收到很多商家朋友询问京东入驻相关问题,今天知舟君就给大家分享下。 一.京东入驻准…

    2022年11月18日
  • 没带卡怎么在ATM机取款(无卡取款怎么操作)

    刷脸消费支付已经十分方便,最近不少银行根据这种刷脸技术,提供了刷脸存取款的业务。我们不需要带卡,就可以直接刷脸取款。下面让我们来看看具体怎么操作。 刷脸取款怎么操作? 【1】我们找…

    2022年11月17日
  • 怎么删除自己的追评(淘宝追评可以删除吗)

    一、淘宝店铺每个评价类型的处理方案都是不同的,那具体哪些评价类型该如何区分呢? 1、主评为好评时:不支持修改或者删除评价的,若中评/差评改为好评,也不可修改或删除 ; 2、当主评为…

    2022年11月17日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息