Discuss / Java / 廖老师看看这里是不是有问题

廖老师看看这里是不是有问题

Topic source

浪过扬帆

#1 Created at ... [Delete] [Delete and Lock User]

incrementAndGet()方法的作用是加1后返回新值,但是

public int incrementAndGet(AtomicInteger var) {
    int prev, next;
    do {
        prev = var.get();
        next = prev + 1;
    } while ( ! var.compareAndSet(prev, next));//这里只是将var的值更新为next,而prev的值没有变
    return prev;//这里返回的是之前的值,并不是新值
}

Java 13源码里面是这样的:

public final int incrementAndGet() {
    return U.getAndAddInt(this, VALUE, 1) + 1; //这里返回值加了1
}
@HotSpotIntrinsicCandidatepublic final int getAndAddInt(Object o, long offset, int delta) {
    int v;    
    do {
        v = getIntVolatile(o, offset);    
    } while (!weakCompareAndSetInt(o, offset, v, v + delta));    
    return v;
}

getAndAddInt()方法作用是差不多的,但是调用它的incrementAndGet()方法最后返回值加了1,所以您的incrementAndGet()方法是不是应该返回next才对

The__Wolf

#2 Created at ... [Delete] [Delete and Lock User]

我也感觉有问题,要么返回next,要么返回var的当前值(CAS函数中更新了var的值)

你不说我也没注意,这里确实有点问题

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

以jdk源码为准

应该是修改了吧,我看这节文档现在是2楼说的 return next

苦海迷途

#6 Created at ... [Delete] [Delete and Lock User]
AtomicInteger var 这个是引用,prev已经改变了,其它的线程改变的,廖老师的代码是没错的

  • 1

Reply