在 Hotspot JVM 中调用 object.notifyAll() 会导致锁定 rebiasing/inflation 吗?

Does calling object.notifyAll() cause lock rebiasing/inflation in Hotspot JVM?

当我在一个完全不满足(可能有偏见,如果当前 JVM 允许的话)监视器上调用 object.notifyAll() 时,特别是如果没有线程实际在监视器上等待,它会导致监视器重新偏置 and/or inflation?

它只会导致偏向锁撤销(偏向 -> 瘦状态转移)。

参考热点源码(synchronizer.cpp):

void ObjectSynchronizer::notifyall(Handle obj, TRAPS) {
    if (UseBiasedLocking) {
       BiasedLocking::revoke_and_rebias(obj, false, THREAD);
       assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
    }

    markOop mark = obj->mark();
    if (mark->has_locker() && THREAD->is_lock_owned((address)mark->locker())) {
        return;
    }
    ObjectSynchronizer::inflate(THREAD,
                          obj(),
                          inflate_cause_notify)->notifyAll(THREAD);
}

调用方检查锁是否偏向(并在必要时撤销锁),然后检查 mark->has_locker()(与 "is monitor thin" 相同)。如果是这样,那么它的等待集为空并且执行快速退出而没有任何 inflation 或其他影响(is_lock_owned_check 执行仅在非法使用的情况下抛出 IllegalMonitorStateException)。

另请注意,在 Java 9 中,notify 的入口点是 quick_notify 作为 JEP 143: Improve Contended Locking 的一部分,但它仍然执行相同的检查。