使用文件getAbsolutePath()java的竞争条件

时间:2014-01-11 12:21:15

标签: java multithreading file race-condition

当我在Java程序中调用file.getAbsolutePath()时,似乎我遇到了竞争条件。

在一个线程中,我正在处理一个文件,当它完成处理时,我正在更改文件名并将其移动到UNIX文件系统上的另一个目录。

在并行运行的单独线程中,我试图打开正在处理的文件并读取其内容。在99%的用例中,此操作很好,但有时我注意到操作失败并出现FileNotFound异常。

当我捕获此异常时,我正在记录file.getAbsolutePath()值,我看到该值是已移动到的已处理目录中文件路径的串联,以及该文件的路径。处理完成前它所在的目录。

过去有没有人遇到类似问题,你是如何解决这个问题的?

由于

1 个答案:

答案 0 :(得分:0)

您似乎需要使用执行此操作的类来同步来自不同线程的文件访问,我们将其称为FileManager

实现FileManager的第一个选择是使用独占锁。例如:

class FileManager {

   private Object lock = new Object();

   public void processFile() {
       synchronized(lock) {
            ...
       }
   }

   public void readFile() {
      synchronized(lock) {
            ...
      }  
   }
}

如果读者比读者多得多,读/写锁更合适,因为它允许多个并发读者,但只有一个作者:

class FileManager {

   private final Lock readLock;
   private final Lock writeLock;

   FileManager() {
       ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(false);
       readLock = readWriteLock.readLock();
       writeLock = readWriteLock.writeLock();
   }

   public void processFile() {
       writeLock.lock();

       try {
            ...
       }
       finally {
          writeLock.unlock();
       }
   }

   public void readFile() {
       readLock.lock();

       try {
            ...
       }
       finally {
          readLock.unlock();
       } 
   }
}