Java信号量选项

时间:2013-06-10 19:04:41

标签: java multithreading synchronization semaphore

我正在编写一个应用程序,其中有多个线程可能会尝试修改同一个文件。为了解决这个问题,我想到了将文件名存储在并发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()
}

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

1 个答案:

答案 0 :(得分:2)

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

java.util.concurrent

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

modifyFile(fileName);
{
 semaphore = map.get(fileName);
 semaphore.acquire(1);
 doWork();
 semaphore.release(1);
}