当我在Java程序中调用file.getAbsolutePath()
时,似乎我遇到了竞争条件。
在一个线程中,我正在处理一个文件,当它完成处理时,我正在更改文件名并将其移动到UNIX文件系统上的另一个目录。
在并行运行的单独线程中,我试图打开正在处理的文件并读取其内容。在99%的用例中,此操作很好,但有时我注意到操作失败并出现FileNotFound
异常。
当我捕获此异常时,我正在记录file.getAbsolutePath()
值,我看到该值是已移动到的已处理目录中文件路径的串联,以及该文件的路径。处理完成前它所在的目录。
过去有没有人遇到类似问题,你是如何解决这个问题的?
由于
答案 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();
}
}
}