Patrząc na Java Virtual Machine Specification i skompilowany kod mówi nam, w jaki sposób bloki "synchronized" są zaimplementowane w java. Poniższy kod:JVM Synchronized Finally Blocks
public void testSync()
{
Object obj = getSomeObject();
synchronized (obj) { doSomething(); }
}
... jest z grubsza odpowiednikiem tego Pseudokod:
public void testSync()
{
Object obj = getSomeObject();
Object __temp = obj;
monitorenter __temp;
try { doSomething(); }
finally { monitorexit __temp; }
}
... z jednym wyjątkiem.
Z jakiegoś powodu w tabeli wyjątków wyświetlane są dwie ostatnie procedury obsługi. Np
Exception table:
from to target type
12 20 23 any
23 25 23 any
Pierwszy obsługi, gdzie się spodziewać, że jest to, ale drugi teleskopowa jest rzeczywiście na końcu bloku pierwszego przewodnika, a jeśli łapie wyjątek wykonuje on ten sam obsługi. Możesz to sobie wyobrazić w następujący sposób:
try { doSomething(); }
finally { beginTry: try { monitorexit __temp; } finally { goto beginTry; } }
Czy ktoś wie, dlaczego tak jest? Gdyby był to tylko blok finally, nie byłoby tam drugiego wpisu w tabeli. Poza tym nie widzę żadnego powodu, dla którego chciałbym ponownie wykonać blok finally, jeśli jest już zgłoszony wyjątek.
Dzięki Brandon
Wydaje mi się, że zwolnisz monitor nawet w przypadku wyjątku. –
Czy spróbuj uwolnić monitor nieskończoną liczbę razy, nawet jeśli jest jasne, że nie będziesz w stanie? Ha! – aboveyou00
Kiedy jest jasne, że nie będziesz w stanie? Jest ważny warunek, że blokady i odblokowania są zawsze zrównoważone. –