0

我正在编写一个应用程序,其中可能有多个线程试图修改同一个文件。为了克服这个问题,我考虑将文件名存储在并发哈希图中,文件名<->计数并使用等待和通知,即

if(map has fileName){
 map.put(fileName, map.get(fileName)++ )
 wait()
}else{
 map.put(fileName,1)
}

modifyFile(fileName);

{
 count = map.get(fileName);
 if count == 1 then map.remove(fileName)
 else map.put(fileName, count-- )
 notify()
}

但我不觉得上面的代码很优雅。有一个更好的方法吗?
编辑:一个简单的锁会阻塞所有线程的流程。我只是想阻止想要修改同一个文件的线程,其他线程应该不受影响

4

1 回答 1

2

您的代码实际上不是线程安全的。if count == 1在从映射中删除对象之前,多个线程可以同时通过检查。

java.util.concurrent

包含一个可以更好地工作的信号量实现。然后只需使用哈希图来存储信号量。不要添加/删除信号量,只需访问它们。然后同步工作由信号量而不是您的地图完成。

modifyFile(fileName);
{
 semaphore = map.get(fileName);
 semaphore.acquire(1);
 doWork();
 semaphore.release(1);
}
于 2013-06-10T19:10:02.880 回答