Java-并发&交错

时间:2015-05-19 20:51:28

标签: java multithreading concurrency

因此,我们的任务是找到导致结果< 10。 现在我很难找到所说的交错。

我的第一个想法是:

- 从第一个线程到最后一个迭代的for循环
然后线程开始交错,因此sum重置为1 - 这将导致sum = 10

第二个想法是:

-let他们从头开始交错 - 两个线程的每个时间都将被升级,然后是总和 - 这也会导致sum = 10

现在我不知道怎么可能得到低于10的总和。 我添加了代码,任何帮助将不胜感激。

public class ConcurrentCounter {

private static int sum = 0;
private static final int max = 10;

public static void main(String[] args) throws InterruptedException {
    Runnable count = new Runnable() {
        @Override
        public void run() {
            int countedSoFar;

            for (int i = 0; i < max; i++) {
                countedSoFar = sum;

                //helps to see more interleavings
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                sum = countedSoFar + 1;
            }
        }
    };


    Thread countFirst = new Thread(count);
    Thread countSecond = new Thread(count);

    countFirst.start();
    countSecond.start();

    //wait until both threads are finished
    countFirst.join();
    countSecond.join();

    System.out.println(sum);
}
}

这是我在这里发表的第一篇文章,所以我希望它符合所有标准,如果不是,我可以为任何评论家开放。

1 个答案:

答案 0 :(得分:1)

理论上,如果我没有记错,你可以得到sum = 2 - 让我们假设以下情况:

  1. 两个主题都以countedSoFar = 0开头。
  2. 第一个主题将执行9轮,将sum更改为9
  3. 第二轮完成第一轮,将sum更改回countedSoFar (=0) + 1 = 1
  4. 第一个主题开始上一轮设置countedSoFar = sum = 1
  5. 第二个线程完成所有轮次(值sum并不感兴趣)
  6. 设置sum = 1+1
  7. 的第一轮结束