美文网首页
21.AtomicInteger、AtomicLong

21.AtomicInteger、AtomicLong

作者: 段段小胖砸 | 来源:发表于2021-10-21 11:22 被阅读0次

加减:

public class MyClass { 
    private AtomicInteger count = new AtomicInteger(0); 
    public void add() { 
        count.getAndIncrement(); 
    }
    public long minus() { 
        count.getAndDecrement(); 
    } }

源码:

    public final int getAndIncrement() {
        return U.getAndAddInt(this, VALUE, 1);
    }

    public final int getAndDecrement() {
        return U.getAndAddInt(this, VALUE, -1);
    }

U是Unsafe的对象。AtomicInteger的 getAndIncrement() 方法和 getAndDecrement() 方法都调用了一个方法:U.getAndAddInt(…) 方法,该方法基于CAS实现

public final int getAndAddInt(Object o, long offset, int delta) {
        int v;
        do {
            v = this.getIntVolatile(o, offset);
        } while(!this.weakCompareAndSetInt(o, offset, v, v + delta));

        return v;
    }

do-while循环直到判断条件返回true为止。该操作称为自旋。getAndAddInt 方法具有volatile的语义,也就是对所有线程都是同时可见的。

而 weakCompareAndSetInt 方法的实现:

public final boolean weakCompareAndSetInt(Object o, long offset, int expected, int x) {
        return this.compareAndSetInt(o, offset, expected, x);
    }

简单就是利用的unsafe和cas和volatile

相关文章

网友评论

      本文标题:21.AtomicInteger、AtomicLong

      本文链接:https://www.haomeiwen.com/subject/wdlfaltx.html