正文

JAVA并发编程学习笔记之CAS操作 分享2014-03-27 10:18:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/javaxx/54415.html

分享到:

CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。


我们常常做这样的操作


if(a==b) {


a++;


}


试想一下如果在做a++之前a的值被改变了怎么办?a++还执行吗?出现该问题的原因是在多线程环境下,a的值处于一种不定的状态。采用锁可以解决此类问题,但CAS也可以解决,而且可以不加锁。


int expect = a;


if(a.compareAndSet(expect,a+1)) {


doSomeThing1();


} else {


doSomeThing2();


}


这样如果a的值被改变了a++就不会被执行。


按照上面的写法,a!=expect之后,a++就不会被执行,如果我们还是想执行a++操作怎么办,没关系,可以采用while循环


while(true) {


int expect = a;


if (a.compareAndSet(expect, a + 1)) {


doSomeThing1();


return;


} else {


doSomeThing2();


}


}


采用上面的写法,在没有锁的情况下实现了a++操作,这实际上是一种非阻塞算法。


应用


java.util.concurrent.atomic包中几乎大部分类都采用了CAS操作,以AtomicInteger为例,看看它几个主要方法的实现:


public final int getAndSet(int newValue) {


for (;;) {


int current = get();


if (compareAndSet(current, newValue))


return current;


}


}


getAndSet方法JDK文档中的解释是:以原子方式设置为给定值,并返回旧值。原子方式体现在何处,就体现在compareAndSet上,看看compareAndSet是如何实现的:


public final boolean compareAndSet(int expect, int update) {


return unsafe.compareAndSwapInt(this, valueOffset, expect, update);


}


不出所料,它就是采用的Unsafe类的CAS操作完成的。


再来看看a++操作是如何实现的:


public final int getAndIncrement() {


for (;;) {


int current = get();


int next = current + 1;


if (compareAndSet(current, next))


return current;


}


}


几乎和最开始的实例一模一样,也是采用CAS操作来实现自增操作的。


++a操作和a++操作类似,只不过返回结果不同罢了


public final int incrementAndGet() {


for (;;) {


int current = get();


int next = current + 1;


if (compareAndSet(current, next))


return next;


}


}


此外,java.util.concurrent.ConcurrentLinkedQueue类全是采用的非阻塞算法,里面没有使用任何锁,全是基于CAS操作实现的。CAS操作可以说是JAVA并发框架的基础,整个框架的设计都是基于CAS操作的。


缺点:


1、ABA问题


CAS操作容易导致ABA问题,也就是在做a++之间,a可能被多个线程修改过了,只不过回到了最初的值,这时CAS会认为a的值没有变。a在外面逛了一圈回来,你能保证它没有做任何坏事,不能!!也许它讨闲,把b的值减了一下,把c的值加了一下等等,更有甚者如果a是一个对象,这个对象有可能是新创建出来的,a是一个引用呢情况又如何,所以这里面还是存在着很多问题的,解决ABA问题的方法有很多,可以考虑增加一个修改计数,只有修改计数不变的且a值不变的情况下才做a++,也可以考虑引入版本号,当版本号相同时才做a++操作等,这和事务原子性处理有点类似!


2、比较花费CPU资源,即使没有任何争用也会做一些无用功。


3、会增加程序测试的复杂度,稍不注意就会出现问题。


总结:


可以用CAS在无锁的情况下实现原子操作,但要明确应用场合,非常简单的操作且又不想引入锁可以考虑使用CAS操作,当想要非阻塞地完成某一操作也可以考虑CAS.不推荐在复杂操作中引入CAS,会使程序可读性变差,且难以测试,同时会出现ABA问题。


(转自 www.jvtarena.com)




阅读(16525) | 评论(19)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

评论人:人妻賴88975 发布时间: 2024-04-17 14:44:09
LINE:88975 #臺灣約無套#處女#學生妹#肛交#內射#口爆#人妻熟女#奶水辣媽#氣質正妹模特#空姐#優質素質茶#口碑素質茶#外貌素質茶#回點紅牌茶出差旅遊工作找小姐叫小姐援交妹飯店汽車旅館酒店找口碑頂級流量茶莊#台北外送茶#台中外送茶#高雄外送茶#新竹外送茶#彰化外送茶#台南外送茶 telegram喝茶頻道:https://t.me/K99520 【telegram:@k59420】
评论人:mline34386 发布时间: 2023-01-10 22:36:49
奶糖外送茶籟34386外約按摩指油壓理容全套愛愛各種好妹安全保證不虧款不轉賬不買點數滿意現金消費不滿意可退可換 台灣在地外約各行各業正妹兼職中 性愛成癮18歲學生超大奶 淫蕩少婦人妻 貧乳幼齒初下海 饑渴熟女姊姊 潮吹小淫逼嫩穴 每天上百位正妹兼差 想要的可以加籟34386或TG:nini9595官網 http://www.5280344.com TG每日更新 https://t.me/m5280344
评论人:mline34386 发布时间: 2023-01-10 22:36:48
奶糖外送茶籟34386外約按摩指油壓理容全套愛愛各種好妹安全保證不虧款不轉賬不買點數滿意現金消費不滿意可退可換 台灣在地外約各行各業正妹兼職中 性愛成癮18歲學生超大奶 淫蕩少婦人妻 貧乳幼齒初下海 饑渴熟女姊姊 潮吹小淫逼嫩穴 每天上百位正妹兼差 想要的可以加籟34386或TG:nini9595官網 http://www.5280344.com TG每日更新 https://t.me/m5280344
评论人:mline34386 发布时间: 2023-01-10 22:36:47
奶糖外送茶籟34386外約按摩指油壓理容全套愛愛各種好妹安全保證不虧款不轉賬不買點數滿意現金消費不滿意可退可換 台灣在地外約各行各業正妹兼職中 性愛成癮18歲學生超大奶 淫蕩少婦人妻 貧乳幼齒初下海 饑渴熟女姊姊 潮吹小淫逼嫩穴 每天上百位正妹兼差 想要的可以加籟34386或TG:nini9595官網 http://www.5280344.com TG每日更新 https://t.me/m5280344
评论人:mline34386 发布时间: 2023-01-10 22:19:05
奶糖外送茶籟34386外約按摩指油壓理容全套愛愛各種好妹安全保證不虧款不轉賬不買點數滿意現金消費不滿意可退可換 台灣在地外約各行各業正妹兼職中 性愛成癮18歲學生超大奶 淫蕩少婦人妻 貧乳幼齒初下海 饑渴熟女姊姊 潮吹小淫逼嫩穴 每天上百位正妹兼差 想要的可以加籟34386或TG:nini9595官網 http://www.5280344.com TG每日更新 https://t.me/m5280344
评论人:mline34386 发布时间: 2023-01-10 22:19:04
奶糖外送茶籟34386外約按摩指油壓理容全套愛愛各種好妹安全保證不虧款不轉賬不買點數滿意現金消費不滿意可退可換 台灣在地外約各行各業正妹兼職中 性愛成癮18歲學生超大奶 淫蕩少婦人妻 貧乳幼齒初下海 饑渴熟女姊姊 潮吹小淫逼嫩穴 每天上百位正妹兼差 想要的可以加籟34386或TG:nini9595官網 http://www.5280344.com TG每日更新 https://t.me/m5280344
评论人:mline34386 发布时间: 2023-01-10 22:19:03
奶糖外送茶籟34386外約按摩指油壓理容全套愛愛各種好妹安全保證不虧款不轉賬不買點數滿意現金消費不滿意可退可換 台灣在地外約各行各業正妹兼職中 性愛成癮18歲學生超大奶 淫蕩少婦人妻 貧乳幼齒初下海 饑渴熟女姊姊 潮吹小淫逼嫩穴 每天上百位正妹兼差 想要的可以加籟34386或TG:nini9595官網 http://www.5280344.com TG每日更新 https://t.me/m5280344
评论人:外約瀨85po 发布时间: 2022-09-09 01:21:29
外送茶加賴85po現金消費大奶巨乳茶H.K奶雙北外送茶.新北外約.台中外送茶.高雄外送茶.台南外送茶官網.lg5221.com 外送茶加賴85po現金消費大奶巨乳茶H.K奶雙北外送茶.新北外約.台中外送茶.高雄外送茶.台南外送茶官網.lg5221.com 外送茶加賴85po現金消費大奶巨乳茶H.K奶雙北外送茶.新北外約.台中外送茶.高雄外送茶.台南外送茶官網.lg5221.com 外送茶加賴85po現金消費大奶巨乳茶H.K奶雙北外送茶.新北外約.台中外送茶.高雄外送茶.台南外送茶官網.lg5221.com
评论人:tang02aa 发布时间: 2019-11-19 17:47:06
高雄外送茶/高雄叫小姐/高雄叫茶Line: ay5520高雄一夜情/高雄援交/高雄叫小姐電話預約 高雄按摩舒壓 高雄外送茶/高雄叫小姐/高雄叫茶Line: ay5520高雄一夜情/高雄援交/高雄叫小姐電話預約 高雄按摩舒壓
评论人:tang02aa 发布时间: 2019-11-19 17:46:54
高雄外送茶/高雄叫小姐/高雄叫茶Line: ay5520高雄一夜情/高雄援交/高雄叫小姐電話預約 高雄按摩舒壓
评论人:year听 发布时间: 2016-05-28 17:06:10
欲速则不达,学习需脚踏实地,深圳南山/西乡/龙华嵌入式培训 《吉米罗恩》里面有一句话是这样说的:吃别人不能吃的苦,忍受别人不能忍受的委屈。做别人不愿意做的事,就能享受别人不能享受的一切。 正如学习也是一样的,IT嵌入式学习固然是很枯燥很无味,但是吃得苦中苦方为人上人,只要你自己坚定了学习目标加上名师指点,全日制通过4个多月的时间学会嵌入式是完全有可能的。所以想学习嵌入式的朋友们请不要着急,深圳民治嵌入式培训/深圳南山嵌入式培训/深圳西乡嵌入式培训都是你可信赖的培训学习场所公司下属的信盈达实训学院:专业为个人和企业实施嵌入式培训和技术咨询服务,学院依托公司项目开发团队和多年的行业服务背景。由多年从事嵌入式控制器开发经验的工程师来指导学员的实训和学习。 信盈达开设以下培训课程: 嵌入式系统实训就业班、嵌入式arm+linux,嵌入式arm,嵌入式linux, cortex系列班,stm32实训班,硬件设计,电子基础,pcb画板等南山。 包教会QQ:2116084661 罗老师 信盈达实训网址:http://www.edu118.com
评论人:深冬到了 发布时间: 2015-12-21 18:47:50
这年头,网上的Java教程一堆一堆的,看的我们很多Java宝宝们 是眼花缭乱,不知该如何是好,我当年也是从这个过程走过来的, 每天看很多老师的Java教程,听的自己晕头转向的,当然我不是 说他们讲错了,他们讲的知识层面的东西是对的,但是很多做Java,只要加入【499099015】,你就可以学到你想学到的东西,有免费的腾讯课堂,更有大牛解答 教程的老师不善于深入浅出,通俗易懂的来为我们讲解知识,什么 是好教程?好教程就是让我们学了之后,有一种豁然开朗的感觉, 而不是云深不知处,我想说的是这种教程,不看也罢,浪费了时间,迷茫了自己。
评论人:深冬到了 发布时间: 2015-12-21 18:47:44
有一种教程叫无论你身处何地,都能现场直播教你 现在很多网上流传的教程都是很多年前的,远远的不适应现在Java新应用的需要, 基本上都是一些淘汰货,很多小伙伴们,从网上找这种破烂, 学的还不亦乐乎,也是醉了。综上所述,我们很多人学不好Java, 是因为 一开始就选择错了,选择不对,努力白费。 为了能够让广大Java学子们在网上学到Java的系统精华知识, 通俗易懂的理解这些知识,我们决定现在每天晚上现场直播在网 上教大家学习Java,我们的老师,一般的老师不用,我们只让牛掰 的老师讲,而你什么都不需要付出,你只需要来我们这个群[499,099,015],学习没有任何借口,想强大就要努力 ,同时这也不是一个单打独斗的时代了,大家在这里一块学习, 打拼出属于我们的Java新天地。
评论人:深冬到了 发布时间: 2015-12-21 18:47:39
java注重的是实战,你要是真心学java可以来这个qun看看:【499,099,015]】, 这里每天都会有java的视频教程更新,还有人帮助解决各种java问题,有专人讲解。只要自己认真, 再加上一起交流,你会学到很多的在别的地方学不到的java知识。
评论人:szeducom 发布时间: 2015-09-07 10:50:02
轻松就业,高薪实习,让众多有志往单片机、ARM/嵌入式系统、Linux方向发展的哥们迅速提升职业技能, 经过系统提升后,保证就业5-10K.更多疑问咨询南宁信盈达:Q2532176025 13397813997黄!
评论人:乐乐乐乐乐乐 发布时间: 2015-08-27 10:07:51
啦啦啦啦~~(邢台123 http://www.jinshixun.com/ yy)
评论人:我是豌豆墩儿 发布时间: 2015-08-25 17:36:31
第一次加尾巴 ~ 哈哈 我也是新人报道(邢台招聘网 http://www.jinshixun.com/ nn)
您需要登录后才能评论,请 登录 或者 注册