Первый вопрос здесь: это - очень короткая все же фундаментальная вещь в 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)
...
}
Нет. run ()
запускается в собственном контексте с точки зрения синхронизации. Никаких замков не держит. Если бы это было так, то либо возникла бы тупиковая ситуация, либо это нарушило бы спецификации, в которых говорится, что только один поток может удерживать блокировку объекта в любой момент времени.
Если run ()
должен был вызвать somemethod ()
снова для того же объекта, ему пришлось бы ждать вызова somemethod ()
, который создал это завершить в первую очередь.
Я предполагаю, что новый поток запускается параллельно синхронизированному методу.
someMethod () по-прежнему удерживает собственную блокировку, которая предотвращает одновременный вызов этого метода только для данного экземпляра объекта.
Поток не наследует блокировку и будет заблокирован только в том случае, если поток попытается вызвать someMethod () для объекта, который его создал, если someMethod () в настоящее время выполняется для этого объекта.
Нет, только исходный поток имеет блокировку (поскольку фактически только один поток может удерживать блокировку).