Предположим, я выполняю блок кода synchronized
внутри некоторого потока, а внутри блока 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
.