完全に満足していない (現在の JVM で許可されている場合はバイアスされている可能性がある) モニターを呼び出すとobject.notifyAll()
、特にモニターで実際に待機しているスレッドがない場合、モニターのリバイアスやインフレが発生しますか?
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 のエントリ ポイントはJEP 143: Improvement Contended Lockingquick_notify
の一部ですが、とにかく同じチェックを実行することに注意してください。
于 2016-07-10T14:31:39.940 に答える