多线程访问文件

11

我们有一个多线程的Java程序。多个线程将写入文件,而一个线程将从该文件中读取。我正在寻找一些设计思路。需要同步吗?

(Note: 保留了原文中的HTML标签)
7个回答

6
理论上,FileChannel是线程安全的。根据javadoc文档:
文件通道可供多个并发线程使用。关闭方法可以在任何时候调用,如Channel接口所指定的那样。仅在任何给定时间只能有一个涉及通道位置或可以更改其文件大小的操作正在进行;尝试在第一个操作仍在进行时启动第二个此类操作将被阻塞,直到第一个操作完成。其他操作(特别是那些需要显式位置的操作)可以同时进行;它们是否实际上这样做取决于底层实现,因此是未指定的。
如果您能使用这些,则可以使用内置同步,而无需编写自己的同步代码。

5
我会考虑在这种情况下进行同步。想象一下,两个线程(t1和t2)同时打开文件并开始写入。第一个线程执行的更改被第二个线程覆盖,因为第二个线程是最后一个将更改保存到文件的线程。当线程t1正在写入文件时,t2必须等待t1完成任务才能打开它。
此外,如果您关心文件的最新更新时间,您应该将写入线程与读取文件的线程同步,以便如果有任何线程正在写入文件,则读取线程应该等待。

2
如果同步不是很重要,您可以让编写器在自己的线程中运行,并允许其他线程将写入排队到文件中。虽然我认为首先要考虑的是是否真正需要写入文件。特别是在高流量情况下,大量磁盘I/O可能不太有效率。

1
如果你需要多个读者和一个写者,你需要寻找读写锁或读写互斥量。
但是你需要多个写者和一个读者。你如何知道这些写者不会覆盖彼此的数据?它们是否被隔离开来?

另外,考虑使读写锁公平,以防止读者饿死写者。 - Chris Vest

0

一旦多个线程访问共享数据,则必须进行同步。如果多个线程在没有任何形式的锁定的情况下写入同一文件,则可能会出现丢失更新问题。

阅读在某些情况下并不是很大的问题,因此您需要考虑...如果一个线程正在读取文件,并且同时另一个线程更新了文件,那么读取线程是否需要知道更改?如果是这样,那么您也需要为读取线程锁定文件。


0
如果您同时有读者和写者或者多个写者,那么您需要同步(锁定)操作。如果只有读者,您不需要进行任何同步操作。
您不希望两个进程同时写入同一个文件,或者一个进程在另一个进程正在读取该文件时写入该文件。

0
在这种情况下,同步是必要的。FileChannel 对于防止进程外部 JVM 修改文件非常有用:但是对于包含多个线程写入单个文件的应用程序则不然。 来自 FileChannel 的 JavaDoc 更深层次地解释道:
“文件锁定代表整个 Java 虚拟机进行。它们不适合控制同一虚拟机中多个线程对文件的访问。”
请参见 this post,了解在多个线程之间共享文件写入的策略简述。

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