调用object.notifyAll()会导致Hotspot JVM中的锁定重新定位/膨胀吗?

时间:2016-07-10 13:26:28

标签: java jvm synchronized jvm-hotspot biased-locking

当我在一个完全没有条件的时候调用object.notifyAll()(可能有偏见,如果当前JVM允许这样做)监视器,特别是如果没有线程实际上在监视器上等待,它是否会导致监视器重新定位和/或充气?

1 个答案:

答案 0 :(得分: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的通知入口点quick_notifyJEP 143: Improve Contended Locking的一部分,但无论如何都会执行相同的检查。