使用ReentrantLock同步,经典银行账户问题

1.新建Account类,使用ReentrantLock同步增加和减少金额方法。

package com.xkzhangsan.reentrantlockpack.bank;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Account {
    
    private double balance;
    
    private final Lock lock = new ReentrantLock();
    
    public void addAmount(double amount){
        lock.lock();
        try {
            double tmp = balance;
            Thread.sleep(10);
            tmp+=amount;
            balance=tmp;
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public void substractAmount(double amount){
        lock.lock();
        try {
            double tmp = balance;
            Thread.sleep(10);
            tmp-=amount;
            balance=tmp;
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }
    
    

}

2.其他和https://www.cnblogs.com/xkzhangsanx/p/10759690.html一致。

注意释放锁

finally {
            lock.unlock();
        }

3.测试结果

Account start money:1000.000000
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Bank substract 1000 balance:0.0
Bank add 1000 balance:1000.0
Account end money:1000.000000

参考:java7并发编程实战手册

GitHub地址:https://github.com/xkzhangsan/java-concurrent-practice

猜你喜欢

转载自www.cnblogs.com/xkzhangsanx/p/10765476.html