访问用于异步I / O的缓冲区的限制究竟是什么?

时间:2016-01-06 10:47:48

标签: java asynchronous nio

根据the documentation for AsynchronousFileChannel

  

读取或写入时使用的ByteBuffer对于多个并发I / O操作不安全。此外,在启动I / O操作之后,应注意确保在操作完成之后才访问缓冲区。

在某种程度上,这似乎比实际需要的要严格得多。在其他方面,它似乎不够严格。特别是:

  • 即使写入操作不能修改缓冲区内容,也不允许您在写入操作中使用ByteBuffer进行读取。
  • 如果I / O操作中只涉及ByteBuffer的一部分,则您无法读取或写入相同ByteBuffer不相交部分
  • 在I / O操作中,您无法更改ByteBuffer的位置或限制。
  • 没有说你不能在不同的I / O操作中使用两个slice的缓冲区,因为它们是两个不同的引用相同底层缓冲区的ByteBuffer个对象。它甚至没有说明你有重叠切片的情况。

这些要点是否正确?或者更准确地在其他地方指定限制?

1 个答案:

答案 0 :(得分:0)

根据Buffer的文档:

  

线程安全

     

多个并发线程使用缓冲区是不安全的。如果一个缓冲区要由多个线程使用,则应通过适当的同步来控制对缓冲区的访问。

由于ByteBuffer没有显示线程安全的明确迹象,因此在异步I / O使用它时访问它可能会导致数据损坏或竞争条件。