2013-02-27 16 views
7

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

+2

Wydaje mi się, że zwolnisz monitor nawet w przypadku wyjątku. –

+0

Czy spróbuj uwolnić monitor nieskończoną liczbę razy, nawet jeśli jest jasne, że nie będziesz w stanie? Ha! – aboveyou00

+0

Kiedy jest jasne, że nie będziesz w stanie? Jest ważny warunek, że blokady i odblokowania są zawsze zrównoważone. –

Odpowiedz

2

Jeśli jest to wybór pomiędzy próbuje w kółko, aby zwolnić monitor bezskutecznie oraz postępowanie nie zwalniając go, obie alternatywy spowoduje impasu; tylko jeśli kontynuujesz bez zwalniania, wówczas impas nie nastąpi, dopóki następnym razem nie spróbujesz zdobyć monitora, a ten problem może być daleki od początkowego niepowodzenia. Również próba zwolnienia monitora może w końcu się udać, a pozostawienie monitora nieopublikowanego jest pewną katastrofą. Lepiej spróbuj ponownie.

+0

ujmuj to w ten sposób, ma to dużo więcej sensu. Sądzę, że byłem po prostu w złym stanie umysłu. Dzięki! – aboveyou00

+0

@ aboveyou00: to sprawia, że ​​myślisz. musi być zabawny, aby zaimplementować te rzeczy, wiedząc, że musi działać na wszystkich rodzajach procesorów. –

+0

Tak, w ten sposób, nawet nieskończona pętla jest lepsza niż pozostawienie monitora niewydanego. – maaartinus