AsynchronousByteChannel.read()的 Javadoc说操作是异步进行的,但是当到达流的末尾时会发生什么?是否允许在调用 read() 的同一线程中触发完成处理程序?从实现的角度来看,没有理由异步执行此操作,因为我们已经知道结果。类似地,如果用户尝试读取剩余()返回 0 的 ByteBuffer,我们知道读取操作必须返回 0。
我问是因为我在自己的 AsynchronousByteChannel 实现中遇到了竞争条件。我正在调用一个完成处理程序,该处理程序在操作完成时对其自身调用 notify()。然后我调用以下用户代码:
CompletionHandler<?, ?> handler = ...;
synchronized (handler)
{
asyncByteChannel.read(handler);
handler.wait();
}
请注意,用户假设操作完成时将通知处理程序,但由于 read() 实际上同步调用完成处理程序,它在 wait() 之前得到通知,后者将永远阻塞。
规范是否要求我在单独的线程中更新 CompletionHandler,或者用户是否应该知道调用 read() 的线程可能会同步执行某些操作?