Java: что происходит, когда новый поток запускается из синхронизированного блока? - PullRequest
6 голосов
/ 26 февраля 2010

Первый вопрос здесь: это очень короткая, но фундаментальная вещь в 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)
    ...
}

Ответы [ 3 ]

11 голосов
/ 26 февраля 2010

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

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

5 голосов
/ 26 февраля 2010

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

0 голосов
/ 26 февраля 2010

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

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

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

...