【问题标题】:Concurrent Modification Exception in Java SetJava Set 中的并发修改异常
【发布时间】:2014-03-10 18:45:13
【问题描述】:

作为我程序的一部分,我坚持使用并发修改异常。这是提到的部分:

PriorityQueue<Customer> marginalGainHeap = new PriorityQueue<Customer>(
            1, new Comparator<Customer>() {
                public int compare(Customer c1, Customer c2) {
                    return Double.compare(c1.getMarginalGain(),
                            c2.getMarginalGain());
                }
            });

    // set of all remains available nodes
    availableNodes.removeAll(churnNet);
    for (Customer avail : availableNodes) {
        avail.setMarginalGain(0);
        marginalGainHeap.add(avail);
    }
    while (seedSet.size() <= budget) {
        **for (Customer remainingNode : availableNodes) {**

            remainingNode.setMarginalGain(calculateMarginalGain(
                    remainingNode, seedSet, network, availableNodes,
                    churnNet));

            marginalGainHeap.remove(remainingNode);
            marginalGainHeap.add(remainingNode);
        }
        seedSet.add(marginalGainHeap.poll());
    }

这里是calculateMarginalGain方法:

private int calculateMarginalGain(Customer remainingNode,
            HashSet<Customer> seedSet,
            DirectedSparseGraph<Customer, Transaction> net,
            Set<Customer> availableNodes, HashSet<Customer> churnNetwork) {
        // Marginal gain for short-term campaign
        HashSet<Customer> tmp = new HashSet<Customer>(); // seedset U
                                                            // {remainingNode}
        tmp.add(remainingNode);
        Set<Customer> tmpAvailableNodes = availableNodes;
        HashSet<Customer> NeighborOfChurn = getNeighbors(churnNetwork, net);
        // sigma function for calculating the expected number of influenced
        // customers- seedSettmp=seedset U {u}
        tmpAvailableNodes.removeAll(NeighborOfChurn);
        Set<Customer> influencedNet = getNeighbors(tmp, net);
        tmpAvailableNodes.retainAll(influencedNet);
        return tmpAvailableNodes.size();
    }

我在用 ** 指定的程序行中遇到了这个异常。我发现这个错误可能是由迭代器引起的。但是我一个都没用!请帮助我找出导致该异常的原因以及如何解决?

问候。

【问题讨论】:

  • 如果另一个线程在迭代集合时尝试更新集合,则会出现此类异常。请检查

标签: java collections concurrentmodification


【解决方案1】:

将您的设置转换为数组可能会解决您的问题

例子:

Set<String> set = new Set<String>(size);
String[] array = set.toArray(new String[set.size()]);

所以在你的 for 循环中你可以做这样的事情:

for(String foo : set.toArray(new String[notis.size()])) {
    // Loop stuff here
}

【讨论】:

    【解决方案2】:
    **for (Customer avail : availableNodes) {**
        avail.setMarginalGain(0);
        marginalGainHeap.add(avail);
    }
    

    这是一个迭代。它被称为“简化的 for 循环”。并且在使用这种形式的循环时,您无法修改正在迭代的元素。相反,使用

    for (int i = 0; i < availableNodes.size(); i++) {
     Customer currentNode = availableNodes.get(i);
     currentNode.setMarginalGain(0);
     marginalGainHeap.add(currentNode);
    }
    

    【讨论】:

    • 但是您正在迭代availableNodes并更新marginGainHeap,那么问题是什么??
    • 当前节点上的“setMarginalGain”表示对该节点的修改。
    • 我找不到这个方法的实现,你在哪里找到的??
    • 这可能是 OP 没有在此处发布的代码的某些部分。
    • 发布任何答案的方式都不正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2013-03-01
    • 2012-11-21
    • 2016-11-19
    相关资源
    最近更新 更多