【问题标题】:Is it possible to read/write concurrently to a memory-mapped file if I can guarantee I will be reading/writing from/to different areas concurrently?如果我可以保证我将同时读取/写入不同的区域,是否可以同时读取/写入内存映射文件?
【发布时间】:2015-03-15 08:45:09
【问题描述】:
我正在尝试在 Java 中实现对内存映射文件的读/写访问(一个读线程和一个写线程)。我知道 FileChannel 支持并发,所以我想知道是否可以使用 Java 中的内存映射文件完成类似的操作。我可以保证我永远不会同时读取和写入 MemoryMappedBuffer 的同一区域,换句话说,我将同时使用读取线程读取一个区域并使用写入线程写入另一个区域。运气好吗?
【问题讨论】:
标签:
java
io
real-time
nio
memory-mapped-files
【解决方案1】:
如果您的线程正在访问不同的内存区域,则永远不会有任何问题。必须注意Buffer 的位置、限制和标记,这些值不得同时访问。如果你限制你的代码只使用基于索引的访问器方法,你没有问题。或者,您可以使用 duplicate 为每个线程创建一个缓冲区,以具有独立的线程本地位置和限制。
您还可以使用position、limit 和slice 的组合来创建强制覆盖原始缓冲区不同区域的缓冲区。它们还将具有独立的位置和限制,因此,一旦您确保它们不重叠并且每个缓冲区都被限制在一个线程中,它们就永远不会有任何竞争条件。