• 使用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
  • 相关阅读:
    JVM内存结构解析
    tomcat服务器日志分页
    20多个常用的免费WebService接口
    将tomcat设置在服务中为开机自动启动
    oracle11g安装常见错误
    Resultset 转化成list或map
    SprngMVC工作原理
    Spring中ContextLoaderListener作用
    oracle如何导出和导入数据库/表
    轻松搭建Redis缓存高可用集群
  • 原文地址:https://www.cnblogs.com/xkzhangsanx/p/10771760.html
Copyright © 2020-2023  润新知