18 | 如何用硬件同步原语(CAS)替代锁?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
CAS和FAA是由计算机硬件提供的原子操作,用于实现并发操作的数据安全性和性能优化。CAS通过比较后交换的方式保证操作的原子性,而FAA则是获取当前值后增加指定值,最后返回之前的值。这两种原语由CPU提供实现,可以避免并发问题。文章通过Go语言示例介绍了CAS和FAA的基本语义和特点,并举例说明了如何使用CAS来替代锁,实现同样的安全性。此外,还讨论了CAS原语的反复重试方式和FAA原语的简单性能优势。读者可以通过学习硬件同步原语,了解如何利用硬件提供的原子操作来优化并发操作的性能,从而更好地应用于实际开发中。
《消息队列高手课》,新⼈⾸单¥59
全部留言(46)
- 最新
- 精选
- ponymm“CAS 和 FAA 在各种编程语言中,都有相应的实现,可以来直接使用,无论你是使用哪种编程语言,它底层使用的系统调用是一样的,效果也是一样的。” 李老师这句话有点小问题:car,faa并不是通过系统调用实现的,系统调用的开销不小,cas本来就是为了提升性能,不会走系统调用。事实上是在用户态直接使用汇编指令就可以实现
作者回复: 感谢你指出错误,我已经联系编辑在文稿中改正了。
2019-09-03250 - 微微一笑老师好,实现了下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-03330 - 奕NodeJS中,没有发现有关操作CpU原语CAS或者FAA的实现的
作者回复: 可以试试这个:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics
2019-09-03210 - 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-036 - 明日Java实现: https://gist.github.com/imgaoxin/a2b09715af99b993e30b44963cebc530
作者回复: transfer2要放在循环中,否则有可能转账失败。 另外,transfer1中,虽然一个简单的加法不会引起任何异常,但总是把unlock放到finnally中是一个好习惯。
2019-09-032 - 张三Java里边有支持FAA这种CPU指令的实现吗?以前没听说
作者回复: 在java中,可以看一下java.util.concurrent.atomic.AtomicLong#getAndAdd
2019-09-0332 - 衹是一支歌CAS FAA是不是只能用于单机情况下的资源控制访问呢?
作者回复: 是的。这也是为什么分布式事务如此之难的原因。
2020-06-23 - Sicily9有一个小疑问,关于原子性的话,有一个极端情况,多核并行情况下 两个线程 同时在执行一个cas原语 会有安全问题吗
作者回复: 不会的,可以放心使用。
2019-11-193 - 长期规划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-042