AtomicInteger:getAndIncrement()的实现原理求解

迎风奔跑 2017-08-15 11:31:15
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()循环又能怎么样呢?费解
...全文
2766 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
胖到没有朋友 2020-07-11
  • 打赏
  • 举报
回复
引用 楼主 迎风奔跑 的回复:
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()循环又能怎么样呢?费解
那你这么说的话,说明你没有看它的构造方法,它构造方法里传入一个int值的时候,会把value赋值给私有变量,这个变量是用volatile修饰的,也就是说,他每次取值取得是自己缓存变量中的副本,由于这个变量使用了volatile,每次这个变量更改的时候,它们都会重新去内存中取入新的值来当做新的副本变量,所以说 它副本里的变量并不是取来之后就不变了
meet_aas 2020-07-10
  • 打赏
  • 举报
回复
都2020年了 都被翻了出来
oXiaoHou123 2020-07-10
  • 打赏
  • 举报
回复
这个方法只是完成自己本身的功能,而你不理解是因为你没有把这两个方法的功能与应用场景结合起来!
  • 打赏
  • 举报
回复
这个方法是执行加一操作的,不能判断当值等于几的时候才执行加一,如果有这样的逻辑应该在调用这个方法之前判断

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧