2013-02-27 3 views
7

Глядя на Java Virtual Machine Specification и скомпилированный код сообщает нам, как блоки "synchronized" реализованы в java. Следующий код:JVM Synchronized finally Blocks

public void testSync() 
{ 
    Object obj = getSomeObject(); 
    synchronized (obj) { doSomething(); } 
} 

... примерно соответствует этому псевдокоде:

public void testSync() 
{ 
    Object obj = getSomeObject(); 
    Object __temp = obj; 
    monitorenter __temp; 
    try { doSomething(); } 
    finally { monitorexit __temp; } 
} 

... с одним исключением.

По какой-то причине в таблице исключений отображаются два обработчика finally. Например:

Exception table: 
    from to target type 
     12 20 23 any 
     23 25 23 any 

Первый обработчик, где я ожидаю, что это будет, но второй обработчик фактически для блока, наконец, первого обработчика, и если он ловит исключение он выполняет один и тот же обработчик. Это можно было бы плохо отразить следующим образом:

try { doSomething(); } 
finally { beginTry: try { monitorexit __temp; } finally { goto beginTry; } } 

Кто-нибудь знает, почему это так? Если бы это был только блок finally, второй записи в таблице не было бы там. Кроме того, я не вижу никакой возможной причины для того, чтобы снова выполнить блок finally, если он уже выбрал исключение.

Спасибо, Brandon

+2

Думаю, вы отпустите монитор даже в случае исключения. –

+0

Ты попытаешься выпустить монитор бесконечно много раз, даже если ясно, что ты не сможешь? Ха! – aboveyou00

+0

Когда станет ясно, что вы не сможете? Существует важное условие, что блокировки и разблокировки всегда сбалансированы. –

ответ

2

Если это выбор между попытками снова и снова, чтобы освободить монитор безуспешно, и исходя не отпуская ее, оба варианта приведет к тупиковой ситуации; просто если вы продолжите, не отпуская, тупик не произойдет, пока в следующий раз что-то не попытается получить монитор, и эта проблема может быть далека от первоначального отказа. Также попытка выпустить монитор может закончиться, в то время как разрешение монитора не выпущено - это определенная катастрофа. Так что вам лучше повторить попытку.

+0

Когда вы Положите это так, это имеет смысл. Наверное, я был не в духе. Благодаря! – aboveyou00

+0

@ aboveyou00: это заставляет вас думать. должно быть интересно реализовать этот материал, зная, что он должен работать на всех видах процессоров. –

+0

Да, ставьте этот путь, даже бесконечный цикл лучше, чем оставлять монитор невыпущенным. – maaartinus