java - 内存映射文件是否支持并发获取/放置?

标签 java

我的应用程序需要使用内存映射并发访问数据文件。我的目标是使其在共享内存系统中可扩展。研究了内存映射文件库实现的源码,想不通:

  • 在多个线程中从 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/

相关文章:

java - Jsoup、hashMap数据Key值

Java文件传输文件到服务器

java - SelectOutPut (AnyLogic) 中代理类型的条件

java - Java中获取文件内容

java - LongAdder 如何比 AtomicLong 表现更好

java - 使用 java GUI 旋转图像

java - 显示键/值数据的更好方法是什么

java - 在单个 map 功能中精心制作多行

java - 扩展 jtextfield 值以采用日期格式

java - SQL 中用户提供的排序