当我调用object.notifyAll()
一个完全不满足(可能有偏差,如果当前 JVM 允许这样做)监视器时,特别是如果没有线程实际上在监视器上等待,它是否会导致监视器重新偏置和/或通货膨胀?
问问题
174 次
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_notify
JEP 143:Improv Contended Locking的一部分,但无论如何它都会执行相同的检查。
于 2016-07-10T14:31:39.940 回答