【问题标题】:Reading and Writing in Parallel in JavaJava中并行读写
【发布时间】:2015-03-22 07:21:49
【问题描述】:

我在“共享模式”下读写文件时遇到问题。我的应用程序需要能够以共享模式访问文件或打开文件,这样如果一个线程正在写入文件,另一个线程应该能够从中读取。我见过java.nio.channels.FileLock,但是它有一个问题,我引用了

那么在“共享模式”下访问文件还有什么解决方案呢?允许多次读取访问并允许在写入时读取,反之亦然。例如,如果我可以在打开文件时指定模式,那就太好了..

希望一切都清楚..

附注我使用的是 jdk 1.6,所以不支持 java.nio.Files。

【问题讨论】:

  • 这只是意味着您必须确保在应用程序代码中您的线程不会踩到彼此的脚。
  • 为什么需要“共享模式”?如果只有一个进程同时访问文件,独占模式似乎更安全。否则,您不仅要协调自己的线程(使用 JVM 线程同步相对容易),还要跨进程/JVM。

标签: java multithreading java-io


【解决方案1】:

FileLock 用于协调其他进程的文件访问。

您不需要它(也没有帮助)来协调您自己进程的线程之间的文件访问。

如果我对您的理解正确,您应该对文件进行排他性锁定,以防止其他程序在您的 Java 程序处理该文件时对其进行干扰,然后确保以某种方式在您的应用程序代码中你所拥有的各种线程不会踩到彼此的脚。

后者可以通过Java线程同步来完成。

【讨论】:

  • 我们希望允许多个线程同时读取文件以提高性能,并且只有在我们正在写入时才会阻塞。如果一次只能访问一个文件,那么拥有多个文件访问线程是没有意义的。
  • 您的所有线程都可以同时访问该文件。完全由您的应用程序适当地同步它们(没有其他事情)。
【解决方案2】:

如果您正在同步线程,您可以使用 Java 并发类。有读写锁的实现:

ReentrantReadWriteLock JavaDoc 7

ReentrantReadWriteLock JavaDoc 5

文档给出了一个使用示例。当然,您还需要FileLock 才能跨进程同步。

第二个示例可能对您最有用,但您将访问文件而不是访问集合。您的FileLock 操作将进入ReentrantReadWriteLock 锁定代码。

【讨论】:

    【解决方案3】:

    第一个想法:

    这个解决方案怎么样...每个线程都有自己的java.io.RandomAccessFile 实例,"rws"(或"rwd")模式用于更新操作,"r" 模式用于读取操作。

    由于java.io.RandomAccessFile 中没有缓冲(缓存),并且由于更新程序的"rws"(或"rwd")模式,它们都“看到”了彼此的更改。

    当然,您仍然必须在您的应用程序/库/框架中控制线程不会无意中覆盖彼此的更改(想想原子/compareAndSwap 更新)并搞砸事情。

    第二个想法:

    为了更好的性能并且当你的应用程序(单个进程实例)是文件的唯一访问者时,你可以用一个关心缓冲的小层来抽象文件> 和同步。可能已经在某处实现了......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 2011-11-22
      相关资源
      最近更新 更多