在 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 的一部分,但它仍然执行相同的检查。
当我在一个完全不满足(可能有偏见,如果当前 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 的一部分,但它仍然执行相同的检查。