Javadoc для AsynchronousByteChannel.read() говорит, что операция выполняется асинхронно, но что произойдет, когда будет достигнут конец потока? Разрешено ли реализации запускать обработчик завершения в том же потоке, который вызвал read()? С точки зрения реализации нет смысла выполнять эту операцию асинхронно, потому что мы уже знаем результат. Точно так же, если пользователь пытается прочитать в байтовом буфере, где оставшаяся функция() возвращает 0, мы знаем, что операция чтения должна вернуть 0.
Я спрашиваю, потому что я столкнулся с состоянием гонки в моей собственной реализации AsynchronousByteChannel. Я вызываю обработчик завершения, который сам вызывает notify() после завершения операции. Затем я вызываю следующий пользовательский код:
CompletionHandler<?, ?> handler = ...;
synchronized (handler)
{
asyncByteChannel.read(handler);
handler.wait();
}
Обратите внимание, что пользователь предполагает, что обработчик будет уведомлен, когда операция завершится, но поскольку read() фактически вызывает обработчик завершения синхронно, он получает уведомление до ожидания(), и последний будет заблокирован навсегда.
Требует ли спецификация обновления CompletionHandler в отдельном потоке или пользователи должны знать, что поток, который вызывает read(), может выполнять некоторые операции синхронно?