Предположим, я ' m выполняя синхронизированный
блок кода внутри некоторого потока и внутри блока synchronized
, я вызываю метод, который порождает другой поток для обработки синхронизированного блока кода, который требует такой же блокировки, как и первый метод. Итак, в псевдо-коде Java:
public void someMethod() {
synchronized(lock_obj) {
// a whole bunch of stuff...
// this is the last statement in the block
(new Thread(someOtherMethod())).start();
}
// some more code that doesn't require a lock
}
public void someOtherMethod() {
// some setup code that doesn't require a lock
// return the stuff we want to run in another thread
// that does require a lock
return new Runnable() {
@Override
public void run() {
synchronized(lock_obj) {
// some more code
}
}
};
}
Я понятия не имею, как разобраться в этом коде. Законно ли то, что я написал? Синтаксически я не вижу никаких проблем, но я не уверен, как рассуждать с помощью такого кода. Итак, когда я выполняю someOtherMethod ()
, чтобы создать экземпляр Runnable
, в какой области видимости выполняется код перед выполнением оператора return? Выполняется ли он как часть первого синхронизированного блока? Предположим, что есть другие работающие потоки, которым может потребоваться блокировка lock_obj
.