Java-并发和交错

标签 java multithreading concurrency

所以我们的任务是找到一个交错,其结果是 < 10。 现在我很难找到所说的交错。

我的第一个想法是这样的:

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

第二个想法是:

-让它们从一开始就交错 -每次两个线程的计数都将被升级,然后总和 -这也将导致 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);
}
}

这是我在这里发表的第一篇文章,所以我希望它符合所有标准,如果不符合,我愿意接受任何类型的批评。

最佳答案

理论上,如果我没记错的话,你可以得到 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

关于Java-并发和交错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335889/

相关文章:

java - 如果我们在父类构造函数中添加一个super(),那么在创建子类的对象时,这个super()将调用哪个类?

JavaFx 场景生成器 ImageView 质量

c - Socket多线程实现C

c++ - 是否可以在循环中多次调用 boost :asio io_service. run()?

java - Android studio : CutomListView gives strange output, 它应该提供 firebase 数据。有什么解决办法吗?

java - 哪些操作系统支持在 Java 中监视 native (类似 inotify 的)文件

c# - 如何在命令启动后更改 sql 超时

java - volatile 是否会阻塞或涉及上下文切换?

java - HttpClient 在处理最大数量的请求时会阻塞?

iphone - NSOperation 中的 NSURLConnection 同步方法