• 使用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
    Company add 1000 balance:2000.0
    Bank substract 1000 balance:1000.0
    Company add 1000 balance:2000.0
    Bank substract 1000 balance:1000.0
    Company add 1000 balance:2000.0
    Bank substract 1000 balance:1000.0
    Company add 1000 balance:2000.0
    Bank substract 1000 balance:1000.0
    Company add 1000 balance:2000.0
    Bank substract 1000 balance:1000.0
    Company add 1000 balance:2000.0
    Bank substract 1000 balance:1000.0
    Company add 1000 balance:2000.0
    Bank substract 1000 balance:1000.0
    Company add 1000 balance:2000.0
    Company add 1000 balance:3000.0
    Bank substract 1000 balance:2000.0
    Company add 1000 balance:3000.0
    Bank substract 1000 balance:2000.0
    Bank substract 1000 balance:1000.0
    Account end money:1000.000000

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

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

    寻找撬动地球的支点(解决问题的方案),杠杆(Java等编程语言)已经有了。xkzhangsan
  • 相关阅读:
    POJ 3660 Cow Contest——flody求传递闭包
    最小生成树算法
    最短路练习
    UVa 11491 Erasing and Winning
    uva 1610 聚会游戏
    C#操作Excel
    C#操作Excel文件(转)
    sqlserver行列转换问题(网上搜集)
    ASP.NET常用技术之Cookie
    ASP.NET常用技术之加密解密
  • 原文地址:https://www.cnblogs.com/xkzhangsanx/p/10765476.html
Copyright © 2020-2023  润新知