我需要迭代FastMap.values。
我的问题是基本循环无法通过NullPointerException进行故障转移

基本循环

Collection<Order> orders = myObject.getOpenOrders();
    for (Order order : orders) {
}


问题是我系统中的另一个线程正在编辑fastmap
它正在添加和删除元素,并且我得到了NullPointerException。
很少,但是应该解决。

所以我加了空检查

Collection<Order> orders = myObject.getOpenOrders();
   for (Order order : orders) {
        if (order != null )
   }


仍然得到NullPointerExcetion
所以我尝试如下迭代

    FastMap<String, Order> openOrders = myObject.getOpenOrdersMap();
    for (FastMap.Entry<String, Order> e = openOrders.head(), end = openOrders.tail(); (e = e.getNext()) != end && e != null;) {
        Order order = e.getValue();
    }


但是,当循环变为null时,循环停止了,而不是抛出NullPointerExcetion。
这也是一个问题,因为我需要迭代所有元素。

我假设问题在于for迭代使用values(),并且实际上是指向列表的指针。
我尝试复制列表,但随后在复制过程中也得到了NullPointerExcetion。
任何建议

顺便说一句:我知道更改整个设计是最好的解决方案,并且在每次插入和读取时都使用锁。但是为了解决我的问题,我可以做些更小的更改吗?
任何的想法?

最佳答案

这不是JDK类吗? (进化?)
从文档说:


  如果映射标记为共享,则所有操作都是线程安全的
  包括地图集合的迭代


那么您可能会遇到一些并发问题?
尝试:

FastMap<String, Order> openOrders = myObject.getOpenOrdersMap().shared()

10-06 09:22