【问题标题】:Does memory mapped file support concurrent get/put?内存映射文件是否支持并发 get/put?
【发布时间】:2013-01-24 05:05:41
【问题描述】:

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

  • 在多个线程中读取MappedByteBuffer 是否合法? get 是否在 OS (*nix) 级别阻止其他 get
  • 如果一个线程put 变成一个MappedByteBuffer,内容是否立即对另一个调用get 的线程可见?

谢谢。

澄清一点:线程使用MappedByteBuffer 的单个实例,而不是多个实例。

【问题讨论】:

    标签: java


    【解决方案1】:

    缓冲区不是线程安全的,它们的访问应该由适当的同步控制;请参阅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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2020-11-09
      相关资源
      最近更新 更多