【问题标题】:Java IO Thread SafteyJava IO 线程安全
【发布时间】:2013-06-06 18:08:32
【问题描述】:

我使用MappedByteBuffers通过 volatile 变量实现文件的读取者和写入者之间的线程安全(写入者更新位置,读取者读取写入者的位置)(这是一个文件上传系统,传入的文件是一个流,如果这很重要)。显然,还有更多技巧(稀疏文件,二次映射增长的力量),但归根结底就是这样。

我找不到更快的方法来写入文件,同时读取相同的文件而不将其完全缓存在内存中(由于剪切大小,我无法这样做)。

是否有任何其他 IO 方法可以保证读取器在同一进程中写入字节的可见性? MappedByteBuffer 通过 Java 内存模型间接地做出保证,我希望任何其他解决方案都能做到这一点(阅读:非平台特定等等)。

这是最快的方法吗?我在文档中遗漏了什么吗?

【问题讨论】:

  • 对于直接 ByteBuffer 和 JMM 真的有任何正式的保证吗?
  • zhong.j.yu,Volatile 读取发出适当的内存屏障,MBB 直接写入内存。我无法找到它的正式文档,但它遵循核心规则。

标签: java multithreading concurrency io bytebuffer


【解决方案1】:

几年前我在当时还不错的硬件上做了一些测试,MappedByteBuffer 比任何其他 I/O 技术快大约 20%。写的缺点是需要提前知道文件的大小。

【讨论】:

  • 我使用了一个薄包装器,它可以根据需要为您提供从 1K 到 2GB 的两倍大小的 MBB。它从支持它的稀疏文件开始,这是对大小的最佳猜测(在我的情况下是正确的猜测,但不一定是),然后截断为大小。如果您猜测除了单个额外的元数据写入以进行截断之外至少足够大,则没有不需要的磁盘活动。猜测太大没有惩罚。工作一种享受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2021-12-16
  • 2010-11-14
  • 2014-09-16
  • 2011-11-23
  • 2010-10-12
相关资源
最近更新 更多