从JCIP 书的性能和可扩展性一章:
同步机制针对无竞争的情况进行了优化(易失性始终是无竞争的),在撰写本文时,对于大多数系统来说,“快速路径”无竞争同步的性能成本范围为 20 到 250 个时钟周期。
作者这里的快速路径无竞争同步是什么意思?
从JCIP 书的性能和可扩展性一章:
同步机制针对无竞争的情况进行了优化(易失性始终是无竞争的),在撰写本文时,对于大多数系统来说,“快速路径”无竞争同步的性能成本范围为 20 到 250 个时钟周期。
作者这里的快速路径无竞争同步是什么意思?
这里有两个不同的概念。
慢路径与快速路径代码
这是识别机器特定二进制代码的生产者的另一种方法。
对于 HotSpot VM,慢路径代码是由 C++ 实现生成的二进制代码,而快速路径代码是指由 JIT 编译器生成的代码。
一般来说,快速路径代码要优化得多。要全面了解 JIT 编译器,维基百科是一个很好的起点。
非竞争和竞争同步
Java 的同步构造(Monitors)具有所有权的概念。当一个线程试图锁定(获得所有权)监视器时,它可以被锁定(由另一个线程拥有)或解锁。
非竞争同步发生在两种不同的场景中:
另一方面,竞争同步意味着线程将被阻塞,直到所有者线程释放监视器锁。
回答问题
作者所说的快速路径非竞争同步是指在最便宜的场景(非竞争同步)中最快的字节码转换(快速路径)。
我不熟悉这本书的主题,但一般来说,“快速路径”是一个特定的可能控制流分支,它比其他分支效率高得多,因此是首选,但不能处理复杂的情况。
我假设这本书是在谈论 Java 的synchronized
块/限定符。在这种情况下,快速路径很可能是很容易检测到没有其他线程访问相同数据的路径。那么,这本书的意思是,synchronized
在只有一个线程实际使用对象的情况下,已经优化了他们。
获取同步锁的第一步是单个易失性写入(监控所有者字段)。如果锁是无争议的,那么这就是将发生的一切。
如果锁定是有争议的,那么将会有各种上下文切换和其他机制,这将增加时钟周期。