[CAS] getAndIncrement() 和 incrementAndGet() 方法的区别

执行下段代码

public static void main(String[] args) {
        AtomicInteger one =new AtomicInteger(5);
        int a =one.getAndIncrement();
        System.out.println("a="+a);
        System.out.println("one=" + one );

        AtomicInteger two=new AtomicInteger(5);
        int b=two.incrementAndGet();
        System.out.println("b="+b);
        System.out.println("two=" +two);
  }

执行结果是
[CAS] getAndIncrement() 和 incrementAndGet() 方法的区别_第1张图片
我们看一下这两个方法的底层调用

   public final int incrementAndGet() {
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }
    public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

这两个方法调用的都是 getAndAddInt 这个方法,那看一下这个

	public final int getAndAddInt(Object var1,long var2,int var4){
		int var5;
		do{
			// 获取var1 对象 var2这个地址的值
			var5 = this.getIntVolatile(var1,var2);
			// 如果var1 对象的var2地址的值和var5 一样,那么执行var5=var5+var4
		} while (!this.compareAndSwapInt(var1,var2,var5,var5+var4));
		
		//返回的var5 是取出的那个值,而不是 var5+var4 的值
		return var5;
}

这里应该是将 var5+var4 的值存到内存中,而将var5的值返回去,所以下图中one和two的值是一样的都是内存中的值,而a没有经过+1的操作所以还是原来的初始值,b经过了+1的操作所以变成了6

这里可以根据它方法的名字来区分,getAndIncrement 就是先获取再执行操作所以返回的值是没有+1的,而 incrementAndGet 是执行操作返回的值是+1后的。

你可能感兴趣的:(java并发)