Java 信号量选项

标签 java multithreading synchronization semaphore

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

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()
}

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

最佳答案

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

java.util.concurrent

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

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

关于Java 信号量选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17030980/

相关文章:

java - 如何以多线程方式运行H2数据库?

linux - QApplication 之后的清理

java - Java 中套接字的替代解决方案

java - 返回字符串中的时间

Java - 按字母顺序和数字对对象数组列表进行排序

java - mongo问题中的QueryBuilder和 'in'方法

Java "too many constants"JVM 错误

java - Swing:当 JTree 更新时间过长并卡住其他 GUI 元素时该怎么办?

java - 在 Java 中使用 synchronized (Thread.currentThread()){...} 的目的是什么?

language-agnostic - 如何跨网络互斥?