求助:多线程下装拆箱的迷惑,问题在deposit方法

 class Bank {
 private AtomicReference<Double> balance=new AtomicReference<>(0.0); // 账户余额
private AtomicInteger integer=new AtomicInteger();
 /**
  * 存款
  *
  * @param money 存入金额
  */
 public synchronized  void deposit(double money) {
  //如果改成把old的类型改成double就会死循环,是什么原理
  Double old = balance.get();
  while (!balance.compareAndSet(old, old+money)) {
   old = balance.get();
  }

 }
 public synchronized  void deposit1(int money) {
  //todo
  int old = integer.get();
  while (!integer.compareAndSet(old, old+money)) {
   old = integer.get();
  }

 }

 /**
  * 获得账户余额
  */
 public double getBalance() {
  return balance.get();
 }
 public double getBal() {
  return integer.get();
 }

 public static void main(String[] args) throws InterruptedException {
  Bank account = new Bank();
  //todo:100线程并发
  for(int i=0;i<1000;i++){
   Runnable runnable = () ->{
    account.deposit1(1);
    account.deposit(1);
   };
   new Thread(runnable).start();
  }

 }
}

作者:用心的卷王求你们别卷了
链接:多线程下装拆箱的迷惑在deposit方法_牛客网
来源:牛客网

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值