0

当我调用object.notifyAll()一个完全不满足(可能有偏差,如果当前 JVM 允许这样做)监视器时,特别是如果没有线程实际上在监视器上等待,它是否会导致监视器重新偏置和/或通货膨胀?

4

1 回答 1

3

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

参考热点源代码(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_lock_owned_check执行抛出)。IllegalMonitorStateException

另请注意,在 Java 9 中,notify 的入口点是quick_notifyJEP 143:Improv Contended Locking的一部分,但无论如何它都会执行相同的检查。

于 2016-07-10T14:31:39.940 回答