我遇到了读写以“共享模式”方式访问文件的问题。我的应用程序需要能够以共享模式访问文件,以便如果一个线程正在向文件写入内容,则另一个线程可以从中读取内容。我看到了java.nio.channels.FileLock,但是它存在以下问题:
那么如何以“共享模式”访问文件?有没有其他解决方案可以允许多个读取访问,并且在写入时允许读取或反之亦然。如果我能在打开文件时指定模式将是很好的解决方案。
希望一切都清楚明白。
P.S. 我使用的是 jdk 1.6,因此不支持 java.nio.Files。
我遇到了读写以“共享模式”方式访问文件的问题。我的应用程序需要能够以共享模式访问文件,以便如果一个线程正在向文件写入内容,则另一个线程可以从中读取内容。我看到了java.nio.channels.FileLock,但是它存在以下问题:
那么如何以“共享模式”访问文件?有没有其他解决方案可以允许多个读取访问,并且在写入时允许读取或反之亦然。如果我能在打开文件时指定模式将是很好的解决方案。
希望一切都清楚明白。
P.S. 我使用的是 jdk 1.6,因此不支持 java.nio.Files。
如果您正在同步线程,可以使用Java并发类。有一个读写锁的实现:
ReentrantReadWriteLock JavaDoc 7
ReentrantReadWriteLock JavaDoc 5
文档提供了一个使用示例。当然,您还需要FileLock
来跨进程进行同步。
第二个示例可能对您最有用,但是您将访问文件而不是集合。您的FileLock
操作将在ReentrantReadWriteLock
锁定的代码中执行。
FileLock 用于协调与其他进程的文件访问。
您不需要它(也不会有帮助)来协调您自己进程中的线程之间的文件访问。
如果我理解您的意思正确,您应该对文件获取独占锁,以防止其他程序在您的 Java 程序处理文件时干扰它,然后在应用程序代码中以某种方式确保您拥有的各个线程不会相互干扰。
后者可以通过 Java 线程同步来完成。
第一种想法:
这个解决方案怎么样...每个线程都有自己的java.io.RandomAccessFile
实例,在更新操作中使用"rws"
(或"rwd"
)模式和在只读操作中使用"r"
模式。
由于java.io.RandomAccessFile
没有缓存机制,而且由于更新程序的"rws"
(或"rwd"
)模式,它们都可以“看到”彼此的更改。
当然,您仍然需要在应用程序/库/框架中控制线程不会无意中覆盖对方的更改(考虑原子/compareAndSwap更新),从而搞乱事情。
第二种想法:
为了更好的性能,并且当您的应用程序(单个进程实例)是文件的唯一访问者时,您可以使用一个小层来抽象文件,并关心缓存和同步。可能已经有一个实现存在...