Java中并行读写

4

我遇到了读写以“共享模式”方式访问文件的问题。我的应用程序需要能够以共享模式访问文件,以便如果一个线程正在向文件写入内容,则另一个线程可以从中读取内容。我看到了java.nio.channels.FileLock,但是它存在以下问题:

那么如何以“共享模式”访问文件?有没有其他解决方案可以允许多个读取访问,并且在写入时允许读取或反之亦然。如果我能在打开文件时指定模式将是很好的解决方案。

希望一切都清楚明白。

P.S. 我使用的是 jdk 1.6,因此不支持 java.nio.Files。


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

0

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

ReentrantReadWriteLock JavaDoc 7

ReentrantReadWriteLock JavaDoc 5

文档提供了一个使用示例。当然,您还需要FileLock来跨进程进行同步。

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


0

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

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

如果我理解您的意思正确,您应该对文件获取独占锁,以防止其他程序在您的 Java 程序处理文件时干扰它,然后在应用程序代码中以某种方式确保您拥有的各个线程不会相互干扰。

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


我们希望允许多个线程并发读取文件以提高性能,只有在写入时才阻塞。如果一次只能访问一个文件,那么拥有多个文件访问线程是没有意义的。 - rghome
你的所有线程可以同时访问文件。完全由你的应用程序适当地同步它们(没有其他东西可以做到)。 - Thilo

0

第一种想法:

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

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

当然,您仍然需要在应用程序/库/框架中控制线程不会无意中覆盖对方的更改(考虑原子/compareAndSwap更新),从而搞乱事情。

第二种想法:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接