int [] [] [] - это массив массивов целочисленных массивов, поэтому ваша синхронизированная (tasks [A] [B]) синхронизируется на объекте самого низкого уровня, массиве целых чисел, блокируя другой синхронизированный доступ к этому тот же массив.
synchronized (tasks [A]), с другой стороны, синхронизирует объект на следующем уровне вверх - массив целочисленных массивов. Это предотвращает синхронизированный доступ к этому массиву, что означает, что на практике любой другой код, использующий синхронизированный (задания [A]), будет заблокирован - что, по-видимому, является тем, что вы хотите, при условии, что все ваши обращения к задачам синхронизируются одновременно уровень.
Обратите внимание, что синхронизация ничего не блокирует! Однако, если два потока пытаются синхронизировать один и тот же объект, одному придется подождать.
Неважно, что вы затем работаете с другим объектом (вашим массивом целых чисел).
Боюсь, я говорю, что ответ Андерсоя вводит в заблуждение. Вы делаете правильные вещи.