【发布时间】:2018-10-22 19:17:41
【问题描述】:
我做了一个简单的程序来计算矩阵中的行总和。我想同时这样做,所以我使用了 CyclicBarrier。有时它会按预期工作,但有时会出现小错误,就像程序漏掉一两个数字一样。
这是我的代码:
package synchronizacja;
import java.util.concurrent.CyclicBarrier;
public class SumyWierszamiSekwencyjnie {
private static final int ROWS = 10;
private static final int COLUMNS = 100;
private static int sum;
private static CyclicBarrier barrier = new CyclicBarrier(COLUMNS, new Tmp());
private static class Tmp implements Runnable {
@Override
public void run() {
System.out.println("The sum is: " + sum);
sum = 0;
}
}
private static class CountByColumns implements Runnable {
private void CriticalSection(int wiersz) {
sum += wiersz;
}
@Override
public void run() {
for (int i = 0; i < ROWS; i++) {
CriticalSection(i);
try { barrier.await(); }
catch (Exception e) { System.out.println("Exception"); }
}
}
}
public static void main(String[] args) {
for (int i = 0; i < COLUMNS; i++) {
new Thread(new CountByColumns()).start();
}
}
}
输出应该是
The sum is: 0
The sum is: 100
The sum is: 200
The sum is: 300
The sum is: 400
The sum is: 500
The sum is: 600
The sum is: 700
The sum is: 800
The sum is: 900
有时确实如此,但更多时候它会显示类似的东西
The sum is: 0
The sum is: 100
The sum is: 200
The sum is: 297
The sum is: 400
The sum is: 500
The sum is: 600
The sum is: 700
The sum is: 800
The sum is: 900
为什么会这样?我在想这可能是因为 Tmp 类中的 run() 不必是原子的,所以当前线程可能会在将 sum 设置为 0 之前跳到计算另一行的总和。如果是这样,我该如何防止这种情况?
【问题讨论】:
标签: concurrency java.util.concurrent