簡體   English   中英

帶有 AtomicLong 的 ForkJoinFramework 沒有給出一致的結果

[英]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 - 9868929131072或 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM