为什么hashMap多线程使特定的线程饿死

时间:2015-09-18 11:03:24

标签: java multithreading synchronization

我有这个场景:

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时会获得股票。

对于我的生活,我不知道为什么会这样。任何人都可以看到我在这里看不到的东西吗?

0 个答案:

没有答案