Вызов таймера Java в синхронизированном блоке кодов
Если у меня есть родительский блок кодов с именем A, A синхронизируется. А в A я выполняю дочерний блок кода с именем B. Правильно ли я предполагаю, что B также будет синхронизирован?
Если в AI есть таймер, чтобы задержать выполнение B на определенное время t, есть ли вероятность, что B будет выполнен позже, когда A уже закончил?
Большое спасибо.
P / S: Извините за неясный код, вот как это должно выглядеть
synchronized A{
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
B block
}
}, 2*60*1000);
}
2 ответа
Зависит. Если блок B является блоком кода внутри метода, подобного этому, тогда да... он будет синхронизирован.
public synchronized void methodA() {
// Block B
{
// some code
}
}
Если это другой метод, подобный следующему, то нет:
public synchronized void methodA() {
methodB();
}
public void methodB() {
// Block B code
// Nothing prevents an unsynchronized method from calling this method
// at same time as methodA() holds lock on `this` object
}
Если не methodB
также отмечен synchronized
или вызывается из другого синхронизированного метода (например, / public synchronized methodC()
) или другой механизм синхронизации, то methodB()
не синхронизируется.
Это только самые простые случаи. Вам лучше публиковать пример кода, так как "блок" не определен по умолчанию и тип блокировки синхронизации (неявный на this
через синхронизированный метод против явной блокировки объекта) имеет значение.
Но ваша последняя строка звучит так, как будто вы спрашиваете о синхронном и асинхронном выполнении кода, который, хотя и связан с многопоточностью и synchronized
блоки, это другая концепция.
В этом случае это зависит от того, что происходит в block A
... если новые потоки созданы для выполнения block B
тогда что-нибудь может случиться со временем выполнения кода. Если потоки не созданы, можно предположить, что block A
не будет завершено раньше block B
,
Изменить: на основе кода теперь опубликовано... синхронизированы A block
только гарантирует, что потоки Timer будут создаваться по одному. Но, если нет ничего особенного в Java Timer
рамки, там нет ничего, что помешает двум потокам выполнить B block
в run
метод одновременно... так что убедитесь, что содержимое является потокобезопасным.
То есть не предполагайте, что только потому, что разные случаи Timer
создаются в синхронизированном блоке с одинаковой задержкой, они не попадают в метод run одновременно. Если B block
доступ к внешнему не поточнобезопасному коду (например, статические методы, доступ к диску), у вас могут быть сюрпризы.
Как Амм Сокун упоминал в другом ответе, A{}
вернется раньше
Block B
выполняет.
Блок B будет выполнен после того, как A завершит выполнение, потому что в методе A вы просто планируете запуск B после 2*60*1000
Милли, и таймер позаботится о выполнении B после 2*60*1000
Милли