java addandget,AtomicInteger类中addAndGet的实现

小编典典

无限循环有何帮助?

这意味着:重试直到成功。如果没有循环,则第一次可能不会成功(请参阅下文)。

在“ if(compareAndSet(current,next))”条件下可能返回false的情况是什么?

如果两个线程试图同时修改该值,则会发生这种情况。其中一个将首先到达那里。另一个将失败。

想象两个线程(A和B)试图从5递增到6

A: int current = get(); // current = 5

B: int current = get(); // current = 5

B: int next = current + delta; // next = 6

B: if (compareAndSet(current, next)) // OK

return next;

A: int next = current + delta; // next = 6

A: if (compareAndSet(current, next))

// fails, because "current" is still 5

// and that does not match the value which has been changed to 6 by B

请注意,此类的重点是避免锁。因此,您具有这种“乐观的货币控制”:只需假设没有其他人同时在处理数据,并且如果发现这是错误的,请回滚并重试。

在这种情况下,代码可能会陷入无限循环

并不是的。对于每一个对值有作用的线程,它只能失败一次。

在第二次迭代中从上方线程A:

A: int current = get(); => current now 6

A: int next = current + delta; => next = 7

A: if (compareAndSet(current, next)) => now OK

可以想象,如果其他线程不断地更新该值,那么一个线程将永远等待,直到那时。为了避免这种情况,您需要对“公平”进行一些定义(并发包中的其他一些工具也支持)。

2020-11-19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值