并发线程I / O访问

时间:2012-01-30 21:46:34

标签: java io synchronization

我有一个静态实用程序类FileUtils,它有以下方法:

public static Object readDataFromInternalStorage(String fileName) 
{...}

public static synchronized void 
          writeDataToInternalStorage(Serializable theData, String fileName) 
{...}

尝试从内部存储中读取时,我在read方法中遇到奇怪的java.io.EOFException。这是一个多线程应用程序,其中多个线程可以同时访问此代码(虽然这不是常见的情况)。在考虑了这一点之后,我怀疑是在读取文件时,另一个线程出现并在读取完成之前写入文件,从而破坏了读取。我的假设是否正确?

假设是,解决这个问题的最佳方法是什么?答案只是简单地将'synchonized'添加到我的read方法中,如果我读this post正确锁定整个类?

3 个答案:

答案 0 :(得分:2)

你的假设可能是正确的;在阅读时并发写入可能会导致各种各样的问题。

一种选择是同步读取,但正如您所说,一次只允许一个读取器或写入器。另一种选择是使用ReentrantReadWriteLock来控制读写。这更难使用,但更灵活,允许多个同时读者和独家作家。

答案 1 :(得分:1)

假设您在相应方法结束之前关闭文件句柄,将synchronized添加到read方法应该确保一次只有一个线程正在读取或写入。当然,您还应确保应用程序中没有其他方法正在读取或写入同一文件。

答案 2 :(得分:1)

不能肯定地说,但是根据对同一文件的并发写入,您肯定可能会看到读取中的损坏。通常,您需要通过多个线程同步对单个文件的此类访问。是的,同步read方法会为你做到这一点。还有其他潜在的解决方案,但在您发现需要走更复杂的路径之前,这可能是您最好的选择。