-1

有人可以向我解释一下这段代码吗?

public class Counter {
        private AtomicInteger value = new AtomicInteger();

        public int incrementLongVersion(){//THIS PART2!!!
                int oldValue = value.get();
                while (!value.compareAndSet(oldValue, oldValue+1)){
                         oldValue = value.get();
                }
                return oldValue+1;
        }

}

我的意思是为什么我不能只更改此代码

!value.compareAndSet(oldValue, oldValue+1)

false

? 我知道永远不会出现编译错误语句但是为什么

!value.compareAndSet(oldValue, oldValue+1)

没有得到错误?是不是总是假的太对了?

或者为什么我不能清除那个while循环并返回“oldValue+1”?

谢谢并恭祝安康。

4

2 回答 2

1

如果incrementLongVersion从多个线程调用,value.compareAndSet(oldValue, oldValue+1)可能会返回false. 循环的目的while是确保函数返回一个在所有工作线程中唯一的值。

实现这一点的更好方法是简单地使用incrementAndGetfrom AtomicInteger

public class Counter {
        private AtomicInteger value = new AtomicInteger();

        public int incrementLongVersion(){
                return value.incrementAndGet();
        }

}
于 2017-01-27T17:17:43.443 回答
0

总是false因为您知道该函数的作用,但是编译器不会分析给定方法调用的主体以检查返回值是否始终相同,在这种情况下为 false。

于 2017-01-27T17:03:25.047 回答