AtomicInteger类真的是线程安全的嘛??
public final int incrementAndGet() {
for (;;) {
int current = get();//1
int next = current + 1;//2
if (compareAndSet(current, next))//3
return next;
}
}
以上是源代码,这个操作相当于i++
如果有两个AtomicInteger,i1和i2,i1执行到步骤2,自己栈中的值变成5,没有执行步骤3,因为步骤3才是是写操作,所以此时i1自己的栈中的值是加1后的5,但是主内存中的值还是4,此时i2通过get()得到当前主内存的值,4,进行加1操作,变成5.
到此,i1和i2在他们各自的栈中都是5,现在他们把5这个值写回主内存,i1成功了,它执行的是compareAndSet(4, 5);
i2在执行步骤3的时候,执行的也是compareAndSet(4, 5);但是,此时主内存中第一个参数对应的值已经被i1改成5,所以此次操作失败,i2进入第二个循环,通过步骤1获得当前值5,然后加1,所以最后i2把值变成了6.
如果i2的线程中代码是这样的:
if (i2 == 4)
{
i2.incrementAndGet();//预期是5,但是实际上是6
}
对嘛?