Java 并发:CAS 与锁定 [已关闭]

我正在阅读《Java Concurrency in Practice》一书。在第15章中,他们讨论了非阻塞算法和比较和交换(CAS)方法。

据记载,CAS 的性能比锁定方法好得多。我想问问那些已经使用过这两个概念的人,并想听听你什么时候更喜欢这些概念中的哪一个?它真的快得多吗?

对我来说,锁的用法更清晰,更容易理解,甚至可能更好地维护(如果我错了,请纠正我)。我们真的应该专注于创建与CAS相关的并发代码而不是锁以获得更好的性能提升,还是可持续性更重要?

我知道可能没有严格的规定何时使用什么。但我只想听听一些关于CAS新概念的意见和经验。


答案 1

CAS 通常比锁定快得多,但它确实取决于争用的程度。由于 CAS 可能会在值在读取和比较之间发生变化时强制重试,因此,如果相关变量受到许多其他线程的严重打击(或者如果从旧值(或两者)计算新值的成本很高),则理论上线程可能会陷入忙碌等待状态。

CAS的主要问题是,正确编程比锁定要困难得多。请注意,锁定反过来比消息传递或STM更难正确使用,因此不要将其视为使用锁的响亮认可。


答案 2

操作的相对速度在很大程度上不是问题。相关的是基于锁的算法和非阻塞算法之间的可伸缩性差异。如果你在1或2核系统上运行,不要再考虑这样的事情了。

非阻塞算法通常扩展得更好,因为它们的“关键部分”比基于锁的算法更短。


推荐