我的应用程序需要使用内存映射并发访问数据文件。我的目标是使其在共享内存系统中可扩展。在研究了内存映射文件库实现的源代码后,我无法弄清楚:
MappedByteBuffer
读取是否合法? get
在OS(* nix)级别阻止其他get
吗?put
进入MappedByteBuffer
,该内容是否会立即显示给另一个调用get
的帖子?谢谢。
澄清一点:线程使用MappedByteBuffer
的单个实例,而不是多个实例。
答案 0 :(得分:1)
缓冲区不是线程安全的,它们的访问权限应通过适当的同步来控制;请参阅http://docs.oracle.com/javase/6/docs/api/java/nio/Buffer.html中的“线程安全”部分。 ByteBuffer是Buffer类的子类,因此具有相同的线程安全问题。
尝试使可扩展的共享内存系统中内存映射文件的使用对我来说非常可疑。内存映射文件的使用是为了提高性能。当您进入共享系统时,寻找性能应该是一个给予低优先级的事情。并不是说你应该寻找一个缓慢的系统但是你会遇到很多其他的问题只是让它起作用应该是你开始时的第一个(也是唯一的?)优先级。如果在最后你需要使用内存映射替换你对数据文件的并发访问,我不会感到惊讶。
对于某些想法,例如使用Exchange,请参阅Can multiple threads see writes on a direct mapped ByteBuffer in Java?和Options to make Java's ByteBuffer thread safe。