CAS实现原子操作的三大问题

更新时间:2023-06-03 06:06:01 阅读: 评论:0

结肠癌的早期症状考研英语做题顺序CAS实现原⼦操作的三⼤问题
在java并发包中有⼀些并发框架也使⽤了⾃旋CAS的⽅式来实现原⼦操作,⽐如LinkedTransferQueue类的Xfer⽅法。CAS虽然很⾼效地解决了原⼦操作,但是CAS仍然存在三⼤问题ABA问题,循环时间长开销⼤,以及只能保证⼀个共享变量的原⼦操作。
ABA问题
在CAS操作值的时候,如果⼀个变量是A,变成了B,⼜变成了A,那么使⽤CAS进⾏检查时是发现没有变化,但是的确是变化了。解决思路加⼀个版本号去做标识,有点像线程⾥的信号量⼀样,在每次变量发⽣更新时是版本号+1,那么A–>B–>A 变成 1A->2B->3A,幸运的是咋java1.5开始,JDK的atomic包⾥⾥提供了AtomicStampedReference类来解决,这个类compareAndSet⽅法的作⽤是⾸先检查当前引⽤是否等于预期引⽤,并且检查当前标志是否等于预期标志,如果全部相等,则以原⼦⽅式将该引⽤和该标志的值设定为给定的更新值。
/**
* Atomically ts the value of both the reference and stamp
时间紧迫* to the given update values if the
* current reference is {@code ==} to the expected reference
* and the current stamp is equal to the expected stamp.
鲁智深人物简介
*
* @param expectedReference the expected value of the reference
* @param newReference the new value for the reference
* @param expectedStamp the expected value of the stamp
* @param newStamp the new value for the stamp
* @return {@code true} if successful
*/
public boolean compareAndSet(V  expectedReference,//预期引⽤
V  newReference,//更新后引⽤
int expectedStamp,//预期标志入党宣誓图片
int newStamp){//更新后标志
Pair<V> current = pair;
楚辞
return
expectedReference == ference &&
expectedStamp == current.stamp &&
((newReference == ference &&
newStamp == current.stamp)||
casPair(current, Pair.of(newReference, newStamp)));
}
循环时间长开销⼤
⾃旋CAS如果长时间不成功,会给CPU带来⾮常⼤的执⾏开销,如果JVM能⽀持处理器提供的pau指令,那么效率会有⼀定的提升。pau指令有两个作⽤:
1. 延迟流⽔线执⾏指令de-pipline,使CPU不会消耗过多的执⾏资源,延迟的时间取决与具体实现的版本,在⼀些CPU上延迟时间是0
2. 避免在退出循环的时候因内存顺序冲突引起CPU流⽔线清空,从⽽提⾼CPU执⾏效率。
孔从洲只能保证⼀个共享变量的原⼦操作
当对⼀个共享变量执⾏操作时,我们可以使⽤循环cas(⾃旋锁)的⽅式保证原⼦性,但是对多个共享变量操作时,循环CAS就⽆法保证操作原⼦性,这时后可以取⽤锁,,也可以取巧把多个共享变量合并成⼀个共享变量操作。
从java1.5时,JDK提供了AtomicReference类保证引⽤对象之间的原⼦性。
长夜漫漫,代码做伴加油!
>新生儿舌苔厚白是怎么回事

本文发布于:2023-06-03 06:06:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/843537.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:变量   循环   操作   共享
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图