gpt4 book ai didi

Java 信号量选项

转载 作者:行者123 更新时间:2023-12-02 06:58:13 27 4
gpt4 key购买 nike

我正在编写一个应用程序,其中可能有多个线程尝试修改同一文件。为了克服这个问题,我考虑将文件名存储在并发 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com