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 为例)
【关注】转发了解更多内容,方便后续查看
增城两日游泡稀有的苏打型温泉,游大丰门锦绣大瀑布秋日生活打卡季1day出发增城健康山谷度假温泉酒店泡温泉晚餐2day出发大丰门回家增城健康山谷度假温泉酒店酒店坐落在被誉为北回归线上的瑞士增城白水寨风景度假名胜区内。这是以七星级标
公园城市上新!桂城8个名企百园启用(附定位)11月7日,佛山市南海区桂城街道第二批名企百园项目启用,包括平胜汇江公园海逸产业社区公园三山科创公园世纪StarPark公园等在内,8个主题园集中亮相,让桂城市民又多了一批休闲娱乐
校长专访学会接受孩子的不完美,你的教育焦虑自然不药而愈记者丨陈兴隆开篇语一次没考好就如同天塌,班干部竞选失败就咬牙切齿再也不参加竞选,更有甚者,因为父母或者老师的一次批评,就做出最令人扼腕的冲动决定真实的生活,一定有风有雨。对于习惯了
中国与缅甸交界的边境小村(乡愁)我家乡在祖国遥远的滇西中缅边境腾冲的一个小镇,离省会昆明700公里,这里山高云低,气候四季如春。高耸入云的高黎贡山贯穿全境,被喻腾冲人民的神山。野香蕉这里物产丰富,四季分明。既有高
币圈著名空头棋局座谈会总结棋局是币圈一个老kol,以前微博用户名叫莱特币。出名于18年做空比特币,当然后面也因为做空错失了大牛市。以下是他的座谈会总结。前言我这几年活得有点混沌,我也不知道为什么,大家如果不
东北大环线D30海拉尔阿尔山走西线,深入呼伦贝尔草原腹地海拉尔原本不在我们东北行的计划中,既然来了,当然要对这座陌生的城市做些了解。海拉尔是呼伦贝尔市辖区,是呼伦贝尔市政治经济文化中心,人口35万,因城市北部的海拉尔河而得名。由于时间有
拯救太子计划失败!美媒支招勇士3换3报价火箭伊森加鲁巴勇士要和我火抢文班吗?一些球迷这样调侃。本赛季开始前恐怕没有多少人能预料到账面阵容强大的勇士会十战七败吧。汤神赛前表示自己感觉勇士很快就会迎来一波连胜!有球迷评价你不要学浓眉,他输
11月中路梯队T0法师诞生,王昭君成为四巨头,杨玉环降级注T1的意思是指版本第一梯队的英雄,这类英雄会比普通英雄较为强势,而T0的意思是指凌驾于第一梯队,属于版本非ban必选的英雄。本榜单是结合了官方所公布的排位巅峰赛数据和KPL职业赛
炒掉物业后,长沙一小区交房14年迎来首次分红,居民乐翻了11月5日上午,长沙市开福区滨江君悦香邸小区在第三届业委会第一届业主监督委员会和绝大多数业主的共同努力下,迎来了该小区交房14年来的第一次分红。去年年底,该小区业委会曾因物业公司收
寻秋鄂城大美花湖心花怒放花马湖畔,春花秋月,走马观花,心花怒放。花湖之花,是花容月貌,闭月羞花。花湖之花,是稻花香里说丰年,听取蛙声一片的八庙,是何须浅碧深红色,自是花中第一流的刘钊,是兴尽晚回舟,误入藕
出国工作为什么出入境不能带水果?在现代生活中,出国旅游的人数逐渐增加。出国旅游的人数比历史上任何一个国家都要多。这主要是因为经济的影响,人们变得富有,世界各地区之间的互动变得频繁。在安全稳定的环境下,出国旅游自然