在 Java 中,每个对象都有一个同步监视器。所以我猜这个实现在内存使用方面非常精简,希望速度也很快。
当将它移植到 C++ 时,什么是它的最佳实现。我认为一定有比“pthread_mutex_init”更好的东西,还是 java 中的对象开销真的这么高?
编辑:我刚刚检查过 Linux i386 上的 pthread_mutex_t 有 24 个字节大。如果我必须为每个对象保留这个空间,那就太庞大了。
最佳答案
从某种意义上说,它实际上比 pthread_mutex_init
更糟糕。由于 Java 的等待/通知,您需要一对互斥锁和条件变量来实现监视器。
在实践中,当实现 JVM 时,您会寻找并应用书中每一个特定于平台的优化,然后发明一些新的优化,以使监视器尽可能快。如果你不能在这方面做一个非常艰巨的工作,那么你肯定达不到优化垃圾收集的水平;-)
一个观察是不是每个对象都需要有自己的监视器。当前未同步的对象不需要同步。因此 JVM 可以创建一个监视器池,每个对象都可以有一个指针字段,当线程真正想要在对象上同步时(例如,使用特定于平台的原子比较和交换操作)填充该指针字段。因此监视器初始化的成本不必添加到对象创建的成本中。假设内存被预先清除,对象创建可以是:递减一个指针(加上某种边界检查,对运行 gc 的代码有一个预测为假的分支等等);填写类型;调用最派生的构造函数。我认为您可以安排 Object 的构造函数什么也不做,但显然很大程度上取决于实现。
在实践中,普通的 Java 应用程序不会在任何时候同步很多对象,因此监控池在时间和内存方面可能是一个巨大的优化。
关于c++ - 在 C++ 中,类 Java 对象监视器的最有效实现是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1752897/