消息队列高手课
李玥
美团高级技术专家
52199 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
进阶篇 (21讲)
消息队列高手课
15
15
1.0x
00:00/00:00
登录|注册

18 | 如何用硬件同步原语(CAS)替代锁?

伪代码
逻辑
伪代码
逻辑
感谢与分享
验证方法
作业要求
CAS和FAA替代锁的使用
替代锁
CPU提供的原子操作
代码示例
代码示例
代码示例
原子性
由计算机硬件提供
FAA
CAS
思考题
演示
CAS和FAA原语
使用FAA原语的版本
使用CAS原语的版本
使用锁实现的版本
特殊之处
Atomic Hardware Primitives
小结
CAS版本的账户服务
什么是硬件同步原语?
如何用硬件同步原语(CAS)替代锁?

该思维导图由 AI 生成,仅供参考

你好,我是李玥。上节课,我们一起学习了如何使用锁来保护共享资源,你也了解到,使用锁是有一定性能损失的,并且,如果发生了过多的锁等待,将会非常影响程序的性能。
在一些特定的情况下,我们可以使用硬件同步原语来替代锁,可以保证和锁一样的数据安全性,同时具有更好的性能。
在今年的 NSDI(NSDI 是 USENIX 组织开办的关于网络系统设计的著名学术会议)上,伯克利大学发表了一篇论文《Confluo: Distributed Monitoring and Diagnosis Stack for High-speed Networks》,这个论文中提到的 Confluo,也是一个类似于消息队列的流数据存储,它的吞吐量号称是 Kafka 的 4~10 倍。对于这个实验结论我个人不是很认同,因为它设计的实验条件对 Kafka 来说不太公平。但不可否认的是,Confluo 它的这个设计思路是一个创新,并且实际上它的性能也非常好。
Confluo 是如何做到这么高的吞吐量的呢?这里面非常重要的一个创新的设计就是,它使用硬件同步原语来代替锁,在一个日志上(你可以理解为消息队列中的一个队列或者分区),保证严格顺序的前提下,实现了多线程并发写入。
今天,我们就来学习一下,如何用硬件同步原语(CAS)替代锁?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

CAS和FAA是由计算机硬件提供的原子操作,用于实现并发操作的数据安全性和性能优化。CAS通过比较后交换的方式保证操作的原子性,而FAA则是获取当前值后增加指定值,最后返回之前的值。这两种原语由CPU提供实现,可以避免并发问题。文章通过Go语言示例介绍了CAS和FAA的基本语义和特点,并举例说明了如何使用CAS来替代锁,实现同样的安全性。此外,还讨论了CAS原语的反复重试方式和FAA原语的简单性能优势。读者可以通过学习硬件同步原语,了解如何利用硬件提供的原子操作来优化并发操作的性能,从而更好地应用于实际开发中。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《消息队列高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(46)

  • 最新
  • 精选
  • ponymm
    “CAS 和 FAA 在各种编程语言中,都有相应的实现,可以来直接使用,无论你是使用哪种编程语言,它底层使用的系统调用是一样的,效果也是一样的。” 李老师这句话有点小问题:car,faa并不是通过系统调用实现的,系统调用的开销不小,cas本来就是为了提升性能,不会走系统调用。事实上是在用户态直接使用汇编指令就可以实现

    作者回复: 感谢你指出错误,我已经联系编辑在文稿中改正了。

    2019-09-03
    2
    50
  • 微微一笑
    老师好,实现了下CAS,代码连接:https://github.com/shenyachen/JKSJ/blob/master/study/src/main/java/com/jksj/study/casAndFaa/CASThread.java。 对于FAA,通过查找资料,jdk1.8在调用sun.misc.Unsafe#getAndAddInt方法时,会根据系统底层是否支持FAA,来决定是使用FAA还是CAS。

    作者回复: 👍👍👍

    2019-09-03
    3
    30
  • NodeJS中,没有发现有关操作CpU原语CAS或者FAA的实现的

    作者回复: 可以试试这个:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics

    2019-09-03
    2
    10
  • QQ怪
    MutxLock:https://github.com/xqq1994/algorithm/blob/master/src/main/java/com/test/concurrency/MutxLock.java CAS、FFA: https://github.com/xqq1994/algorithm/blob/master/src/main/java/com/test/concurrency/CAS.java 完成了老师的作业,好高兴

    作者回复: 👍👍👍

    2019-09-03
    6
  • 明日
    Java实现: https://gist.github.com/imgaoxin/a2b09715af99b993e30b44963cebc530

    作者回复: transfer2要放在循环中,否则有可能转账失败。 另外,transfer1中,虽然一个简单的加法不会引起任何异常,但总是把unlock放到finnally中是一个好习惯。

    2019-09-03
    2
  • 张三
    Java里边有支持FAA这种CPU指令的实现吗?以前没听说

    作者回复: 在java中,可以看一下java.util.concurrent.atomic.AtomicLong#getAndAdd

    2019-09-03
    3
    2
  • 衹是一支歌
    CAS FAA是不是只能用于单机情况下的资源控制访问呢?

    作者回复: 是的。这也是为什么分布式事务如此之难的原因。

    2020-06-23
  • Sicily9
    有一个小疑问,关于原子性的话,有一个极端情况,多核并行情况下 两个线程 同时在执行一个cas原语 会有安全问题吗

    作者回复: 不会的,可以放心使用。

    2019-11-19
    3
  • 长期规划
    Python没找到CAS和FAA的实现

    作者回复: CPython(就是我们最常用的Python)中确实没有提供原子操作。可以看一下pypy:https://pypy.org/

    2019-10-09
  • 青舟
    https://github.com/qingzhou413/geektime-mq.git 做了1000万次加法, Lock: 380ms CAS: 200ms FAA: 280ms

    作者回复: java里面有AtomicInteger等等封装好的类,包含了CAS和FAA等原子操作,可以直接使用的。

    2019-09-04
    2
收起评论
显示
设置
留言
46
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部