时间:2017-01-27 16:58:28

标签: java while-loop atomicinteger

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

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"?

谢谢和问候。

2 个答案:

答案 0 :(得分:1)

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

实现此目标的更好方法是简单地使用incrementAndGet中的AtomicInteger

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

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

}

答案 1 :(得分:0)

总是false因为你知道该函数做了什么,但是编译器不分析给定方法调用的主体来检查返回值将始终是相同的,false在这种情况下。