java - JVM 是否为每个对象创建一个互斥锁以实现 'synchronized' 关键字?如果没有,怎么办?

标签 java c++ synchronization jvm implementation

作为一个对 Java 越来越熟悉的 C++ 程序员,看到语言级别支持锁定任意对象而没有任何类型的声明对象支持这种锁定,这对我来说有点奇怪。为每个对象创建互斥锁似乎是自动选择加入的沉重代价。除了内存使用之外,互斥锁在某些平台上是操作系统受限的资源。如果互斥锁不可用,您可以自旋锁,但其性能特征明显不同,我预计这会损害可预测性。

JVM 是否在所有情况下都足够聪明,可以识别特定对象永远不会成为 synchronized 关键字的目标,从而避免创建互斥锁?可以懒惰地创建互斥锁,但这会带来一个引导问题,它本身就需要互斥锁,即使解决了这个问题,我认为仍然会有一些开销来跟踪是否已经创建了互斥锁。所以我假设如果这样的优化是可能的,它必须在编译时或启动时完成。在 C++ 中,由于编译模型的原因,这样的优化是不可能的(你不知道对象的锁是否会跨库边界使用),但我对 Java 的编译和链接知之甚少。如果同样的限制适用。

最佳答案

作为一个研究过一些 JVM 实现锁的方式的人发言......

通常的方法是从对象的标题字中的几个保留位开始。如果对象从未被锁定,或者如果它被锁定但没有争用,它会保持这种状态。如果并且当锁定对象发生争用时,JVM 将锁膨胀成一个成熟的互斥数据结构,并在对象的生命周期内保持这种状态。

编辑 - 我刚刚注意到 OP 正在谈论操作系统支持的互斥锁。在我看过的示例中,未膨胀的互斥锁是直接使用 CAS 指令等实现的,而不是使用 pthread 库函数等。

关于java - JVM 是否为每个对象创建一个互斥锁以实现 'synchronized' 关键字?如果没有,怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1898374/

相关文章:

c++ - 如何读取用户键盘输入?

c++ - 什么是 C++ 原子变量?

ios - 在NSURLSession之后同步执行方法

java - 当您更改触摸位置时,为什么没有 reload() WebView

Java获取资源不起作用

c++ - 具有 const 引用的可变参数模板特化

c++ - 替换特定字母的函数不会以 void 返回类型运行

algorithm - 通过网络同步音频

java - 这些类是线程安全的吗?

Java SocketException。为什么关闭?