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