所以我们的任务是找到一个交错,其结果是 < 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
- 让我们假设以下场景:
- 两个线程均以
countedSoFar = 0
开头。 - 第一个线程将执行 9 轮,将
sum
更改为 9 - 第二个线程完成第一轮,将
sum
更改回countedSoFar (=0) + 1 = 1
。 - 第一个线程开始最后一轮设置
countedSoFar = sum = 1
。 - 第二个线程完成了所有回合(值
sum
并不有趣) - 第一轮结束,设置
sum = 1+1
关于Java-并发和交错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30335889/