[英]ForkJoinFramework with AtomicLong is not giving consistent result
我正在嘗試使用 ForkJoinFramework。 我知道我的代碼可能不是使用 ForkJoin 的好用例,但它至少應該可以工作......
我正在使用 RecursiveAction 來同時修改靜態 AtomicLong 變量。 但是我在那里遇到了一些問題,結果不正確且不一致。(每次我運行它,結果都不一樣)。
我假設 AtomicLong 是線程安全的,所以唯一可能的原因是某些任務丟失了。 但為什么?
`
public class ForkJoinFramework {
private static AtomicLong sum = new AtomicLong(0);
static class MyTask extends RecursiveAction {
private static final long serialVersionUID = 1L;
int left;
int right;
MyTask(int left, int right) {
this.left = left;
this.right = right;
}
@Override
protected void compute() {
if(right - left < 100) {
for(int i = left; i < right; i++) {
sum.getAndIncrement();
}
} else {
ForkJoinTask<Void> leftTask = new MyTask(left, left + (right - left) / 2).fork();
ForkJoinTask<Void> rightTask = new MyTask(left + (right - left) / 2 + 1, right).fork();
leftTask.join();
rightTask.join();
}
}
}
public static void main(String[] args) {
MyTask myTask = new MyTask(0, 10000000);
myTask.compute();
System.out.println("Sum is: " + sum.get());
}
}
`
您有一個差一錯誤。 在你的for
循環中,你沒有計算right
的值,所以如果例如left
是 101 和right
是 150,你只遞增 49 次。
我一直得到的值是9868929
,因為您必須將任務拆分為單獨的ForkJoinTask
s 10000001
- 9868929
或131072
或 2 17 ,根據您的算法,這作為 2 的冪是有意義的。
改變
for(int i = left; i < right; i++) {
到
for(int i = left; i <= right; i++) {
你會得到10000001
,如果你想要10000000
,從1
而不是0
開始。
丟失任務或AtomicLong
的一致性沒有錯; 你剛剛有一個差一錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.