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?
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