Jos*_*vin 17 c++ java implementation synchronization jvm
作为一个越来越熟悉Java的C++程序员,看到语言级别支持锁定任意对象而没有任何声明对象支持这种锁定,这有点奇怪.为每个对象创建互斥锁似乎是一个自动选择的高成本.除了内存使用,互斥体在某些平台上是OS有限的资源.如果互斥锁不可用但你的性能特征明显不同,你可以旋转锁定,我希望这会损害可预测性.
在所有情况下,JVM是否足够智能以识别特定对象永远不会成为synchronized关键字的目标,从而避免创建互斥锁?可以懒惰地创建互斥锁,但是这会引发自举需要互斥锁的自举问题,即使解决了这个问题,我也认为仍然需要一些开销来跟踪是否已经创建了互斥锁.所以我假设如果这样的优化是可能的,它必须在编译时或启动时完成.在C++中,由于编译模型这样的优化是不可能的(你不知道对象的锁是否会跨库边界使用),但我对Java的编译和链接知道不够了解如果适用相同的限制.
Ste*_*n C 16
作为一个看过一些JVM实现锁的方式的人说的话......
通常的方法是从对象的标题字中的几个保留位开始.如果对象永远不会被锁定,或者它被锁定但没有争用就会保持这种状态.如果在锁定对象上发生争用,JVM 会将锁定膨胀为完整的互斥锁数据结构,并且在对象的生命周期内保持这种状态.
编辑 - 我刚刚注意到OP正在谈论操作系统支持的互斥锁.在我看过的例子中,未充气的互斥体是使用CAS指令等直接实现的,而不是使用pthread库函数等.