作为一个越来越熟悉 Java 的 C++ 程序员,看到语言级别支持锁定任意对象而没有任何类型的对象支持这种锁定的声明对我来说有点奇怪。为每个对象创建互斥锁似乎是自动选择加入的沉重代价。除了内存使用之外,互斥锁在某些平台上是操作系统受限的资源。如果互斥锁不可用,您可以自旋锁,但其性能特征明显不同,我预计这会损害可预测性。
JVM 是否在所有情况下都足够聪明,可以识别特定对象永远不会成为同步关键字的目标,从而避免创建互斥锁?可以懒惰地创建互斥锁,但这会带来一个引导问题,它本身就需要互斥锁,即使解决了这个问题,我认为仍然会有一些开销来跟踪是否已经创建了互斥锁。所以我假设如果这样的优化是可能的,它必须在编译时或启动时完成。在 C++ 中,由于编译模型的原因,这样的优化是不可能的(你不知道对象的锁是否会跨库边界使用),但我对 Java 的编译和链接知之甚少。如果同样的限制适用。