我有这个场景:
private static final Map<String, Boolean> availables = new HashMap<String, Boolean>();
1个单独的线程继续获取可用任务并将其分配给worker(让我们称之为经销商)
public static String getAnAvailable() {
synchronized (availables){
for(Map.Entry<String, Boolean> entry : availables.entrySet()){
if(entry.getValue() == true){
entry.setValue(false);
return entry.getKey();
}
}
}
return null;
}
1个单独的线程运行此代码(让我们称之为更新程序):
while(true){
...
synchronized (availables) {
for(String deleteIt : delete){
if(available.containsKey(deleteIt)){
available.remove(deleteIt);
}
}
for(String name : names){
if(!available.containsKey(name)){
available.put(name, true);
}
}
}
...
}
我尝试使用ConcurrentHashMap
代替手动synchronization
,但它可以throw Exception
方法getAnAvailable
,原因很明显,因为如果更新程序线程更改了大小map然后在getAnAvailable中我们得到迭代异常。所以没有必要使用它。
现在我的问题是由于某些原因Updater
无限期地在第三次奔跑中挨饿...
基本上当它试图获得luck
时会获得股票。
对于我的生活,我不知道为什么会这样。任何人都可以看到我在这里看不到的东西吗?