首页 > 其他分享 >经典的同步问题(银行取钱)

经典的同步问题(银行取钱)

时间:2023-04-25 10:11:25浏览次数:34  
标签:同步 name money 银行 ur user 经典 balance public


银行取钱问题是非常经典的同步问题,如果不采用同步方法,可能也不会发生错误,但就是那小概率事件就可以称之为BUG吧。
没有使用同步方法的代码如下:

public class ErrorTest{
    public static void main(String[] args)
    {
        user ur = new user(1000,"账户");
        new errorThread(800,"甲",ur).start();
        new errorThread(800,"乙",ur).start();
    }       
}
class user
{
    private int balance;
    private String name;
    public user(int balance,String name)
    {
        this.balance = balance;
        this.name = name;
    }
    public int getBalance() {
        return balance;
    }
    public void setBalance(int balance) {
        this.balance = balance;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public int hashCode()
    {
        return name.hashCode();
    }
    @Override
    public boolean equals(Object o)
    {
        if (o == this)
        {
            return true;
        }
        if (o.getClass() == user.class && o !=null )
        {
            user ur = (user)o;
            if (ur.name.equals(name))
            {
                return true;
            }
        }
        return false;
    }   
}
class errorThread extends Thread
{
    private int money;
    //private String name;
    private user ur;
    public errorThread(int money,String name,user ur)
    {
        super(name);
        this.money = money;
        this.ur = ur;
    }
    @Override
    public void run()
    {

            if (ur.getBalance() >= money)
            {
                System.out.println(getName()+"成功取出钞票"+money);
                ur.setBalance(ur.getBalance()-money);
                System.out.println("剩下的钱:"+ur.getBalance());
                try{
                    sleep(10);//这里用了sleep(),强制线程切换
                }catch(InterruptedException ie)
                {
                    ie.printStackTrace();
                }
            }

            else
            {
                System.out.println(getName()+"余额不足,取钱失败");
            }

    }
}

运行你结果如下:
甲成功取出钞票800
乙成功取出钞票800
剩下的钱:200
剩下的钱:-600
这样银行岂不会陪哭了?哈哈哈哈。
因此,必须使用同步方法,通常情况下使用被并发访问的共享资源作为同步监视器,代码如下:

public class ErrorTest{
    public static void main(String[] args)
    {
        user ur = new user(1000,"账户");
        new errorThread(800,"甲",ur).start();
        new errorThread(800,"乙",ur).start();
    }       
}
class user
{
    private int balance;
    private String name;
    public user(int balance,String name)
    {
        this.balance = balance;
        this.name = name;
    }
    public int getBalance() {
        return balance;
    }
    public void setBalance(int balance) {
        this.balance = balance;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public int hashCode()
    {
        return name.hashCode();
    }
    @Override
    public boolean equals(Object o)
    {
        if (o == this)
        {
            return true;
        }
        if (o.getClass() == user.class && o !=null )
        {
            user ur = (user)o;
            if (ur.name.equals(name))
            {
                return true;
            }
        }
        return false;
    }   
}
class errorThread extends Thread
{
    private int money;
    //private String name;
    private user ur;
    public errorThread(int money,String name,user ur)
    {
        super(name);
        this.money = money;
        this.ur = ur;
    }
    @Override
    public void run()
    {
        synchronized(ur)
        {
            if (ur.getBalance() >= money)

            {
                System.out.println(getName()+"成功取出钞票"+money);
                ur.setBalance(ur.getBalance()-money);
                System.out.println("剩下的钱:"+ur.getBalance());
                try{
                    sleep(10);
                }catch(InterruptedException ie)
                {
                    ie.printStackTrace();
                }
            }

            else
            {
                System.out.println(getName()+"余额不足,取钱失败");
            }
        }
    }
}

运行结果如下:
甲成功取出钞票800
剩下的钱:200
乙余额不足,取钱失败
这样符合”加锁-修改-释放锁“的逻辑,银行再也不用担心亏钱了,嘻嘻。


标签:同步,name,money,银行,ur,user,经典,balance,public
From: https://blog.51cto.com/u_16087831/6223407

相关文章

  • 【LeetCode动态规划#12】详解买卖股票I~IV,经典dp题型
    买卖股票的最佳时机力扣题目链接(opensnewwindow)给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔......
  • Centos7配置Mysql8主从复制同步数据
    1.首先需要在三台不同主机安装好mysql8,参考:https://www.cnblogs.com/haoxuanchen2014/p/17351034.html主库ip:192.168.2.66从库1ip:192.168.2.67从库2ip:192.168.2.682.配置主库第一步:添加配置文件/etc/my.cnf加多下面两句代码如下(示例):[mysqld]server-id=101 #[必......
  • 集群时钟同步必读-NTP和chrony
     一、 前言搭建和维护集群环境中时钟同步是非常重要一环。如果集群的时间不统一,例如ceph集群就会报错无法更新数据、CDH集群无法添加客户端等等。目前主流在Linux系统搭建集群用到NTP和chrony软件,本文简单介绍两者的集群搭建。二、 NTP和chrony区别根据chrony官......
  • 技术干货|如何利用 ChunJun 实现数据实时同步?
    实时同步是ChunJun的⼀个重要特性,指在数据同步过程中,数据源与⽬标系统之间的数据传输和更新⼏乎在同⼀时间进⾏。在实时同步场景中我们更加关注源端,当源系统中的数据发⽣变化时,这些变化会⽴即传输并应⽤到⽬标系统,以保证两个系统中的数据保持⼀致。这个特性需要作业运⾏过程中......
  • Anki 如何同步 无需网络如何 手机和电脑进行同步
    Anki如何同步无需网络如何手机和电脑进行同步 直接覆盖同步,谁覆盖谁,谁就是最新的。 Anki本地文件    C:\Users\john\AppData\Roaming\Anki2\testAnki手机文件    \\P30\内部存储\AnkiDroid#test为当前项目的名字,所有的文件均在目录下,C:\Users\john\App......
  • UUID与Python线程同步方式
    UUID是如何保证唯一性高可靠,32位16进制数,32*4=128位二进制数,UUID4重复概率1/(2^128),加上时间戳应该好点,UUID1好点。UUIDVersion1:基于时间的UUID时间戳、随机数和机器MAC地址得到。常用UUIDVersion2:DCE安全的UUIDUUID1的时间戳前4位置换为POSIX的UID或GIDUUIDVersion3:......
  • 硬件时钟和系统时钟的同步机制及案例分享
    由于技术能力有限,文章仅能进行简要分析和说明,如有不对的地方,请指正,谢谢......
  • DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步
    场景Kettle-开源的ETL工具集-实现SqlServer到Mysql表的数据同步并部署在Windows服务器上:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119891674上面讲过Kettle的使用,下面记录下阿里开源异构数据源同步工具DataXDataXDataX是一个异构数据源离线同步工具,致力......
  • m基于simulink和S函数实现SVPWM永磁同步电机双PI转矩脉动控制系统仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要        永磁同步电机(PMSM)基本结构为定子、转子和端盖。其中转子磁路结构是永磁同步电机(PMSM)与其它电机最主要的区别,其在很大程度上决定了永磁同步电机(PMSM)的实际性能指标[12,13,14]......
  • 【开源项目】无锡~超经典智慧城市智慧无锡 CIM/BIM数字孪生可视化项目——开源工程及
    智慧无锡免费提供工程和源码,为城市管理和发展提供更智能化的解决方案。项目介绍智慧无锡项目利用数字孪生技术,将无锡市的地理信息、公共数据和实时监测数据进行整合,以数字化形式呈现城市的各种信息和场景。在工程中,利用AI处理地形影像,在溪梁区使用高精度的max模型,其他区域使用AI生......