Java 使用InputStream时的同步

Java 使用InputStream时的同步,java,synchronization,mapreduce,java.util.scanner,bufferedreader,Java,Synchronization,Mapreduce,Java.util.scanner,Bufferedreader,我需要实现一个简短的Map Reduce程序。我需要做的一个操作是将一个txt文件拆分为X个部分,这样,当我只对文件片段执行读取操作时,每个部分都将用作映射函数的输入 我可以将文件拆分为更多的本地文件,并使用每个文件作为映射函数的输入。但我正在考虑尝试这个解决方案:在文件的不同位置使用InputStream构建的X扫描仪中拆分文件 当每个线程使用扫描器对象时,是否会出现同步问题?是否会因为每个线程都试图访问同一个文件而变得更慢?原则上,如果您非常小心,那么如果操作系统允许,您应该能够做到这一点。

我需要实现一个简短的Map Reduce程序。我需要做的一个操作是将一个txt文件拆分为X个部分,这样,当我只对文件片段执行读取操作时,每个部分都将用作映射函数的输入

我可以将文件拆分为更多的本地文件,并使用每个文件作为映射函数的输入。但我正在考虑尝试这个解决方案:在文件的不同位置使用InputStream构建的X扫描仪中拆分文件


当每个线程使用扫描器对象时,是否会出现同步问题?是否会因为每个线程都试图访问同一个文件而变得更慢?

原则上,如果您非常小心,那么如果操作系统允许,您应该能够做到这一点。我建议对于每个线程,在文件上打开一个BufferedReader,然后获取相应的FileChannel对象(通过BufferedReader.getChannel())并锁定该线程打算处理的部分(请参见FileChannel.lock())。如果O/S允许您走到这一步,我认为您不应该有任何实际问题


然而,我想知道这样做是否有很多性能优势。如果可以的话,我想从性能的角度来看,让一个线程串行读取文件可能会更好,然后将适当的顺序行放入线程池操作每个线程的扫描程序。

您可以将整个文件读取到字符串对象,然后在不同位置共享此字符串对象。或者我不明白你需要什么。发布一些代码…如果OP需要使用map/reduce来处理文件,我怀疑它是否适合内存…为什么需要锁定文件来读取它?OP的问题没有提到文件在读取时可能正在更改。@jtahlborn,没错。另一种说法是,当多个线程从同一个文件中读取数据时,我们需要同步吗?@Cookie503-不需要。如果文件不变,为什么需要同步?