Java: что происходит, когда новая дискуссия начата от синхронизируемого блока?

Первый вопрос здесь: это - очень короткая все же фундаментальная вещь в Java, который я не знаю...

В следующем случае, run() метод, так или иначе выполняемый с блокировкой это somemethod() действительно получал?

public synchronized void somemethod() {
    Thread t = new Thread( new Runnable() {
       void run() {
           ...          <-- is a lock held here ?
       }
    }
    t.start();
    ... 
    (lengthy stuff performed here, keeping the lock held)
    ...
}
6
задан cocotwo 26 February 2010 в 07:37
поделиться

3 ответа

Нет. run () запускается в собственном контексте с точки зрения синхронизации. Никаких замков не держит. Если бы это было так, то либо возникла бы тупиковая ситуация, либо это нарушило бы спецификации, в которых говорится, что только один поток может удерживать блокировку объекта в любой момент времени.

Если run () должен был вызвать somemethod () снова для того же объекта, ему пришлось бы ждать вызова somemethod () , который создал это завершить в первую очередь.

11
ответ дан 8 December 2019 в 14:42
поделиться

Я предполагаю, что новый поток запускается параллельно синхронизированному методу.

someMethod () по-прежнему удерживает собственную блокировку, которая предотвращает одновременный вызов этого метода только для данного экземпляра объекта.

Поток не наследует блокировку и будет заблокирован только в том случае, если поток попытается вызвать someMethod () для объекта, который его создал, если someMethod () в настоящее время выполняется для этого объекта.

0
ответ дан 8 December 2019 в 14:42
поделиться

Нет, только исходный поток имеет блокировку (поскольку фактически только один поток может удерживать блокировку).

5
ответ дан 8 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: