2016-06-14 57 views
6

Si supponga Ho 2 adiacenti synchronized blocchi con un Thread.holdsLock() chiamata tra di loro:Thread.holdsLock() e ingrossamento blocco

final Object lock = new Object(); 
// ... 
synchronized (lock) { 
    // do stuff 
} 
if (Thread.holdsLock(lock)) { 
    throw new IllegalStateException(); 
} 
synchronized (lock) { 
    // do more stuff 
} 

Ora, cosa succede se ad un certo punto la JVM decide di coarsen la serratura e unire quanto sopra synchronized blocchi? La chiamata Thread.holdsLock() restituirà ancora false oppure il codice non funzionerà con un'eccezione?

+4

Non ho prove, ma penso che l'approssimazione può accadere solo se il JIT può provare che non ha avuto alcun effetto visibile. In questo caso ovviamente lo farebbe, quindi sospetto fortemente che il lucchetto non vi sia reso grossolano. – yshavit

risposta

6

Una buona domanda, direi no in base allo JSR 133 Cookbook. La griglia mostra che un NormalLoad non può essere riordinato sopra un MonitorExit. In questo caso la lettura sarebbe, in teoria, la serratura.

Inoltre, Rafael Winterhalter menziona in un presentation regarding the Java memory model che le chiamate native non possono essere riordinate, ma ho difficoltà a trovare la documentazione per dimostrarlo.