当我在一个完全没有条件的时候调用object.notifyAll()
(可能有偏见,如果当前JVM允许这样做)监视器,特别是如果没有线程实际上在监视器上等待,它是否会导致监视器重新定位和/或充气?
答案 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_notify
是JEP 143: Improve Contended Locking的一部分,但无论如何都会执行相同的检查。