Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文件的线程安全_Java_Multithreading_File - Fatal编程技术网

Java 文件的线程安全

Java 文件的线程安全,java,multithreading,file,Java,Multithreading,File,我有很多应用程序在java中以并发方式写入我的文件。我想使这个操作并发,同时也希望我的文件保持秩序。我有 线程1从网站1写入 线程2从网站2写入 线程3从网站3写入 我想维持秩序 我该怎么做 谢谢您可以使用常规同步机制。创建包含对java.io.file对象的引用的文件存储库。它将公开类似getFile(字符串路径)的API。每次要访问文件时,请执行以下操作: File file = FileRepository.getFile("foo.txt"); synchronized(file) {

我有很多应用程序在java中以并发方式写入我的文件。我想使这个操作并发,同时也希望我的文件保持秩序。我有 线程1从网站1写入

线程2从网站2写入

线程3从网站3写入

我想维持秩序

我该怎么做
谢谢

您可以使用常规同步机制。创建包含对java.io.file对象的引用的文件存储库。它将公开类似getFile(字符串路径)的API。每次要访问文件时,请执行以下操作:

File file = FileRepository.getFile("foo.txt");
synchronized(file) {
  // perform any manipulations. 
}
同步文件访问的另一种方法是:

FileChannel.lock()

使用表示对文件的操作,并确保以适当的顺序(先进先出)从队列中执行操作。你可以把这当作一个问题。您有多个线程捕获数据,一个消费者将数据写入磁盘。

如何维护内容的顺序?队列跟踪这一点,它是一个排序的数据结构。使用Java queue()将项目添加到末尾并从头部移除,因此最早的项目将首先被移除。因此,一个接一个地删除并将其放入一个文件中,您会得到与项目到达时相同的顺序。是的,我认为这是他的问题:当t3在t1之前到达(t3在t1之前完成读取)时,t3应该被推回到队列中(如果队列是正确的答案)。顺序应该由队列维护。我想这取决于将数据转储到磁盘时使用的写入模式。如果每个线程只产生一个巨大的块,那么队列将维持秩序。如果每个线程产生大量的小片段,那么仍然可以使用队列,但更难处理。每个线程都有一个队列,但在任何时间点,只有一个线程队列能够处理文件系统。你说得对,后来添加了分组要求。我假设顺序仅按时间。更具体地说:Thread3无法写入文件,而Thread2尚未写入?3个线程正在同时写入我的文件。但我希望数据保持一致。来自网站1的数据在我的文件中分组,而网站2的数据在一起分组。N个文件是什么对于N个线程?是
FileChannel.lock()
用于线程互斥还是进程互斥?它对两者都有效吗?它用于进程互斥,在同一个jvm中,您将得到一个
OverlappingFileLockException