gpt4 book ai didi

java - NIO2 CompletionHandler 的线程安全

转载 作者:行者123 更新时间:2023-12-04 11:52:18 26 4
gpt4 key购买 nike

以下代码是线程安全的吗?如果是这样,如何保证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) {
//...
}
});

最佳答案

我在 javadocs 中没有看到任何关于 ByteBuffer 的内部状态的明确保证,用于 read()操作,在内部可见 CompletionHandler read()时调用完成。
所以没有100%的保证。
但我想说,期望这是真的是常识。
仅仅是因为:

  • 期待 CompletionHandler 很正常查看“read()”所做的更改
  • 事实CompletionHandler可以在不同的线程中异步运行 — 是 read() 的详细信息的内部实现。结果是 read()担心确保在这种情况下可以安全地发布该内容。

  • 但是,如果您不确定/不相信,并且您不开发具有纳秒延迟的应用程序 — 只需添加您自己的额外同步 — 您将 100% 确定您的程序正常工作。

    关于java - NIO2 CompletionHandler 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68936041/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com