Вызов таймера 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 Милли

Другие вопросы по тегам