AtomicInteger:getAndIncrement()的实现原理求解
AtomicInteger:getAndIncrement()的实现原理求解
javaatomicinteger
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
书上说:
源码中for循环体的第一步先取得AtomicInteger里存储的数值,第二步对AtomicInteger的当前数值进行加1操作,关键的第三步调用compareAndSet方法来进行原子更新操作,该操作先检查当前数值是否等于current,等于意味着AtomicInteger的值没有被其他线程修改过,则将AtomicInteger的当前数值更新成next的值,如果不等compareAndSet方法会返回false,程序会进入for循环重新进行compareAndSet操作。
我的疑问:
如果已经被其他线程修改过,此时再执行for()循环有什么意义呢?预期将3变成4,可谁知这时候被其他线程改成5了,不满足compareAndSet,此时重新进去for()循环又能怎么样呢?费解
javaatomicinteger
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
书上说:
源码中for循环体的第一步先取得AtomicInteger里存储的数值,第二步对AtomicInteger的当前数值进行加1操作,关键的第三步调用compareAndSet方法来进行原子更新操作,该操作先检查当前数值是否等于current,等于意味着AtomicInteger的值没有被其他线程修改过,则将AtomicInteger的当前数值更新成next的值,如果不等compareAndSet方法会返回false,程序会进入for循环重新进行compareAndSet操作。
我的疑问:
如果已经被其他线程修改过,此时再执行for()循环有什么意义呢?预期将3变成4,可谁知这时候被其他线程改成5了,不满足compareAndSet,此时重新进去for()循环又能怎么样呢?费解
...全文
相关推荐
java并发之AtomicInteger源码分析
AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。下面小编和大家一起学习一下
AtomicInteger 浅谈
NULL 博文链接:https://zcmor.iteye.com/blog/1535524
Java原子变量类原理及实例解析
主要介绍了Java原子变量类原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java并发——无锁实现
Java并发——无锁实现。无锁比有锁机制更加灵活,更加高效,Java进阶必备。
Java CAS原理分析[项目源码]
本文详细介绍了Java中的CAS(Compare-And-Swap)原理及其应用。CAS是一种CPU同步原语,用于实现无锁并发操作,通过硬件支持确保原子性。文章首先解释了CAS的概念及其在Java中的实现方式,包括乐观锁与悲观锁的区别。随后,通过AtomicInteger类的示例展示了CAS的实际应用,并分析了其内部实现机制。此外,文章还探讨了CAS的缺陷,如ABA问题、循环时间长开销大以及只能保证单一变量原子操作等,并提供了相应的解决方案。最后,总结了CAS在并发编程中的重要性,并鼓励读者深入源码学习。


