我的应用程序需要使用内存映射并发访问数据文件。我的目标是使其在共享内存系统中可扩展。研究了内存映射文件库实现的源码,想不通:
- 在多个线程中从
MappedByteBuffer
中读取是否合法?get
是否会在操作系统 (*nix) 级别阻止其他get
? - 如果一个线程
放入
到一个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?和 Options to make Java's ByteBuffer thread safe .
关于java - 内存映射文件是否支持并发获取/放置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14494353/