【问题标题】:Parallel For Loop java has race condition并行 For 循环 java 有竞争条件
【发布时间】:2017-03-24 19:22:00
【问题描述】:

我有一段代码在我想并行化的循环中运行。 ExecutorService 的使用使代码非常快,但我得到的结果不一致,可能是由于竞争条件。是否有另一个并行的 for 循环可以像这个一样快速运行并且始终保持一致?

ExecutorService exec = Executors.newFixedThreadPool(8);

    try{
        for (String tour : tours)
            {
                if (valid)
                {
                   exec.submit(() ->
                     {
                        double len1 = tsp.tourLen(tour, cities); //expensive sequentially
                        if (bestLen == -1 || len1 < bestLen)
                        {
                            bestLen = len1;
                            bestTour = tour;
                        }
                    });
                }
            }

            System.out.println("\n     Best tour len: " + bestLen);
            System.out.println("\n          Best tour: " + bestTour);

        } finally
        {
            exec.shutdown();
        }

【问题讨论】:

  • 那里不应该有exec.submit()的电话吗?
  • 不知道为什么没有复制添加(谢谢)
  • bestLenbestTour 使用synchronized?
  • 不,你能告诉我这将如何实现吗?
  • 请参阅下面的答案,我会假设您的函数结果没有按顺序排列。

标签: java parallel-processing


【解决方案1】:

我这样做的方法是在后台线程中进行繁重的处理,将其加载到HashMap&lt;String, Double&gt; 中,以避免并发问题。 (游览,len1)

然后使用 foreach lambda hashmap.foreach((k,v) -&gt; /*comparison here*/); 遍历该映射

注意:

虽然我在上面提到了同步,但对于这个问题,我怀疑它是否会有所帮助,因为,你不能对你还没有的数据进行比较。

来源: How to for each the hashmap?

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 2018-07-24
    • 2013-10-17
    • 1970-01-01
    • 2019-08-15
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多