我的应用程序需要使用内存映射同时访问数据文件。我的目标是使其在共享内存系统中具有可扩展性。在研究了内存映射文件库实现的源代码后,我想不通:
MappedByteBuffer
从多个线程中读取 a 是否合法?是否在 OS (*nix) 级别get
阻止其他?get
- 如果一个线程
put
进入 aMappedByteBuffer
,内容对另一个调用的线程是否立即可见get
?
谢谢你。
澄清一点:线程正在使用 的单个实例MappedByteBuffer
,而不是多个实例。
我的应用程序需要使用内存映射同时访问数据文件。我的目标是使其在共享内存系统中具有可扩展性。在研究了内存映射文件库实现的源代码后,我想不通:
MappedByteBuffer
从多个线程中读取 a 是否合法?是否在 OS (*nix) 级别get
阻止其他?get
put
进入 a MappedByteBuffer
,内容对另一个调用的线程是否立即可见get
?谢谢你。
澄清一点:线程正在使用 的单个实例MappedByteBuffer
,而不是多个实例。
缓冲区不是线程安全的,它们的访问应该由适当的同步控制;请参阅http://docs.oracle.com/javase/6/docs/api/java/nio/Buffer.html中的线程安全部分。ByteBuffer 是 Buffer 类的子类,因此具有相同的线程安全问题。
尝试在共享内存系统中使用可扩展的内存映射文件对我来说非常可疑。使用内存映射文件是为了提高性能。当您进入共享系统时,寻找性能应该是一件不那么重要的事情。并不是说您应该寻找一个缓慢的系统,而是您会遇到许多其他问题,只是让它工作应该是您的首要(也是唯一?)开始时的优先事项。如果最后您需要使用内存映射替换对数据文件的并发访问,我不会感到惊讶。
有关使用 Exchanger 的一些想法,请参阅Can multiple threads see writes on a direct mapped ByteBuffer in Java? 和使 Java 的 ByteBuffer 线程安全的选项。