Wenn ich object.notifyAll()
auf einem völlig unzufriedenen (möglicherweise voreingenommen, wenn dies für die aktuelle JVM erlaubt) Monitor, insbesondere wenn keine Threads tatsächlich auf dem Monitor warten, ist es Monitor Rebiasing und/oder Inflation?Ruft das Aufrufen von object.notifyAll() Sperrung von Rebiasing/Inflation in Hotspot JVM auf?
0
A
Antwort
2
Es führt nur zu einer verzerrten Sperrung der Sperrung (voreingestellt -> Dünnschichtübertragung).
Mit Bezug auf Hotspot-Quellcode (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);
}
Anrufer überprüft, ob Sperre vorgespannt ist (und widerrufen, falls erforderlich), dann prüft mark->has_locker()
(es ist das gleiche wie „Monitor dünn ist“). Wenn dies der Fall ist, ist seine Wartezeit leer und der Schnellausstieg wird ohne Inflation oder andere Effekte ausgeführt (is_lock_owned_check
nur ausgeführt, um im Falle illegaler Verwendungen IllegalMonitorStateException
zu werfen).
Beachten Sie auch, dass in Java 9 Einstiegspunkt für die Benachrichtigung ist quick_notify
als Teil JEP 143: Improve Contended Locking, aber es führt die gleichen Prüfungen trotzdem.