2016-07-10 25 views

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.