4

据我了解, synchronized 关键字将本地线程缓存与主内存同步。volatile 关键字基本上总是在每次访问时从主存储器中读取变量。当然,访问主内存比本地线程缓存要昂贵得多,因此这些操作很昂贵。但是,CAS 操作使用低级硬件操作,但仍必须访问主存储器。那么 CAS 操作如何更快呢?

4

2 回答 2

3

我相信关键因素正如您所说 - CAS机制使用低级硬件指令,允许最小的缓存刷新和争用解决。

其他两种机制 (synchronizationvolatile) 使用不同的架构技巧,这些技巧在所有不同的架构中更普遍可用。

CAS 指令在大多数现代架构中以一种或另一种形式提供,但在每种架构中会有不同的实现。

Brian Goetz的有趣引述(据说)

操作的相对速度在很大程度上不是问题。相关的是基于锁和非阻塞算法之间的可扩展性差异。如果您在 1 或 2 核系统上运行,请停止考虑此类事情。

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

于 2013-10-27T20:27:12.323 回答
2

请注意,CAS 不一定必须访问内存。

大多数现代架构都实现了像MESI这样的缓存一致性协议,如果只有一个线程同时访问数据,它允许 CPU 执行快捷方式。在这种情况下,与传统的非同步内存访问相比,开销非常低。

然而,当对同一值进行大量并发更改时,缓存确实毫无价值,所有操作都需要直接访问主存。在这种情况下,同步不同 CPU 缓存和内存访问序列化的开销可能会导致性能显着下降(这也称为缓存乒乓),这可能与您所经历的一样糟糕甚至更糟基于锁的方法。

所以永远不要简单地假设如果你切换到原子,你所有的问题都会消失。原子的最大优势是无锁(总是有人取得进展)或无等待(每个人都在一定数量的步骤后完成)实现的进度保证。但是,这通常与原始性能正交:无等待解决方案可能比基于锁的解决方案慢得多,但在某些情况下,您愿意接受这一点以获得进度保证。

于 2013-10-28T11:19:55.613 回答