以下代码是线程安全的吗?如果是,是什么保证了
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
或者是“有效的final”。无论如何,你都不应该不断地重新分配读取缓冲区。在通道的生命周期内使用同一个缓冲区,并将其保留在键附加中或通过键附加来使用。 - user207421buf
在实质上是最终的。关于缓冲区分配-这是一个样例代码,用于解答问题。 - Malt