我正在编写一个应用程序,其中有多个线程可能会尝试修改同一个文件。为了解决这个问题,我想到了将文件名存储在并发hashmap中,文件名< - > count并使用wait和notify即
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()
}
但我觉得上面的代码并不优雅。有一个更好的方法吗?
编辑:简单的锁定会阻止所有线程的流量。我只想阻止想要修改同一文件的线程,其他线程应该不受影响
答案 0 :(得分:2)
您的代码实际上不是线程安全的。在从地图中删除对象之前,多个线程可以同时通过if count == 1
检查。
java.util.concurrent
包含一个更好的Semaphore实现。然后只需使用hashmap存储信号量。不要添加/删除信号量,只需访问它们。然后同步工作由信号量完成,而不是你的地图。
modifyFile(fileName);
{
semaphore = map.get(fileName);
semaphore.acquire(1);
doWork();
semaphore.release(1);
}