美文网首页
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