zoukankan      html  css  js  c++  java
  • 使用Semaphore同步,经典银行账户问题

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

    package com.xkzhangsan.semaphorepack.bank;
    
    import java.util.concurrent.Semaphore;
    
    public class Account {
        
        private double balance;
        
        private final Semaphore semaphore = new Semaphore(1);
        
        public void addAmount(double amount){
            try {
                semaphore.acquire();
                double tmp = balance;
                Thread.sleep(10);
                tmp+=amount;
                balance=tmp;
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        }
    
        public void substractAmount(double amount){
            try {
                semaphore.acquire();
                double tmp = balance;
                Thread.sleep(10);
                tmp-=amount;
                balance=tmp;
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        }
        
    
        public double getBalance() {
            return balance;
        }
    
        public void setBalance(double balance) {
            this.balance = balance;
        }
        
        
    
    }

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

    注意释放信号量

            } finally {
                semaphore.release();
            }

    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
    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
    Account end money:1000.000000

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

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

    寻找撬动地球的支点(解决问题的方案),杠杆(Java等编程语言)已经有了。xkzhangsan
  • 相关阅读:
    Vue.js中使用iView日期选择器并设置开始时间结束时间校验
    侠客行
    myJRebel 已不可用
    开发.NET Core NuGet包并实现CI/CD
    独立部署GeoWebCache
    GeoServer中GeoWebCache(GWC)的使用
    使用VS Code编写Markdown文件
    GitHub团队协作流程
    打包发布到NPM并通过CDN访问
    使用VS Code编写Markdown文件
  • 原文地址:https://www.cnblogs.com/xkzhangsanx/p/10771760.html
Copyright © 2011-2022 走看看