【发布时间】:2021-10-26 08:50:17
【问题描述】:
以下代码是线程安全的吗?如果是这样,什么保证ByteBuffer实例安全发布到执行CompletionHandler的线程?
AsynchronousSocketChannel channel = ...
ByteBuffer buf = ByteBuffer.allocate(1024);
channel.read(buf, null, new CompletionHandler<Integer, Void>() {
//"completed" can be executed by a different thread than channel.read()
public void completed(Integer result, Void attachment) {
buf.flip(); //Can buf be safely accessed here? If so, why?
//...
}
public void failed(Throwable exc, Void attachment) {
//...
}
});
【问题讨论】:
-
这可以编译吗?
buf必须是final或此处的“有效最终”。在任何情况下,您都不应该继续重新分配读取缓冲区。在频道的整个生命周期内使用相同的密钥,并将其保存在密钥附件中或通过密钥附件保存。 -
@user207421 是的,它可以编译,因为
buf在这种情况下实际上是最终的。关于缓冲区分配 - 这是用于问题目的的示例代码。
标签: java java-memory-model nio2