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