yamlln

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

CAS

CAS (compare and swap)

翻译过来是比较并交换,但他是一个原子性操作。cpu指令为 cmpxchg

CAS

CAS 有三个操作数:当前值A、内存值V、要修改的新值B

假设 当前值A 跟 内存值V 相等,那就将 内存值V 改成B

假设 当前值A 跟 内存值V 不相等,要么就重试,要么就放弃更新

将当前值与内存值进行对比,判断是否有被修改过,这就是CAS的核心

多核cpu:

 

 举例:假如内存中v=1, 则 cpu-1 = 1,cpu-2 = 1,现在线程a将值+1变成2,则先比较内存v和 cpu-1的值是否相等,相等则将内存v更新成2

如果内存v和 cpu-1的值是否不相等,则是其他线程对该值进行了操作,则重试或者什么都不做

单核CPU:

CAS相当于没有加锁,多个线程都可以直接操作共享资源,在实际去修改的时候才去判断能否修改成功,在很多的情况下会synchronized锁要高效很多

CAS缺点

会造成ABA问题

解决方案:Java提供了AtomicStampedReference类供我们用,加了个版本,比对的就是内存值+版本是否一致

阿里巴巴开发手册 LongAdder 对象

阿里巴巴开发手册提及到 推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观锁的重试次数),你能帮我解读一下吗

AtomicLong:做累加的时候实际是多个线程操作同一个资源,在高并发的时候只有一个线程可以执行成功,其他线程都会失败,不断自旋(重试),自旋会成为瓶颈

AtomicLong:把要操作的目标资源「分散」到数组Cell中,每线程对自己的 Cell 变量的 value 进行原子操作,大大降低失败的次数

posted on   yamlln  阅读(71)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示