空指针异常 - 循环访问快速映射值



我需要迭代 FastMap.values。我的问题是基本循环故障转移了空指针异常

基本循环

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

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

所以我添加了空检查

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

我仍然得到空指针所以我尝试按如下方式迭代它

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

如果你有一个多线程环境,你必须绝对使用一些同步,特别是在使用迭代器时。

您不能在另一个线程编辑集合时迭代集合,这将使迭代器失效并破坏所有内容。

所以吞下药丸并使用一些同步,这种情况需要它。

最新更新