线程同步的机制就是队列和锁,把共享的资源加上一把锁,然后把线程进行排队,实现安全的线程。下面为大家模拟银行取钱的实例,代码如下:

public class Unsafebank {public static void main(String[] args) {Account account = new Account(100, "农业银行");//创建两个线程Bank youself = new Bank("自己", account, 50);Bank wife = new Bank("你的媳妇", account, 100);youself.start();wife.start();}
}
//账户
class Account {int money;String name;public Account(int money, String name) {this.money = money;  // 账户余额this.name = name;    //账户名称}
}//银行
class Bank extends Thread {Account account;int nowMoney;  //手里剩余的金钱int withdrawMoney; //取钱金额public Bank(String name, Account account, int withdrawMoney) {super(name);this.account = account;this.withdrawMoney = withdrawMoney;}public void run() {//判断能否取钱withdrawMoney();}private void withdrawMoney() {if (account.money - withdrawMoney < 0) {return;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}account.money = account.money - withdrawMoney;nowMoney = nowMoney + withdrawMoney;System.out.println(this.account.name + "账户余额为:" + account.money);System.out.println(this.getName() + "手里的钱:" + nowMoney);}
}

  上面的代码是创建了两个线程对象对账户的余额进行操作,运行的结果为:


  由上面的结果可以看出,这个线程的不安全的,那么这个时候我们就需要用到进程同步来使这个线程安全。因为这这两个线程对象的操作同一个账户,所以这个账户需要被加一把锁,那我们可以用同步块来实现,那么我们就在取钱的时候,把账户加上一把锁,使线程安全(哪个对象不安全就锁哪个对象)。代码如下:

public class Unsafebank {public static void main(String[] args) {Account account = new Account(100, "农业银行");//创建两个线程Bank youself = new Bank("自己", account, 50);Bank wife = new Bank("你的媳妇", account, 100);youself.start();wife.start();}
}
//账户
class Account {int money;String name;public Account(int money, String name) {this.money = money;  // 账户余额this.name = name;    //账户名称}
}//银行
class Bank extends Thread {Account account;int nowMoney;  //手里剩余的金钱int withdrawMoney; //取钱金额public Bank(String name, Account account, int withdrawMoney) {super(name);this.account = account;this.withdrawMoney = withdrawMoney;}public void run() {//判断能否取钱withdrawMoney();}private void withdrawMoney() {//给账户加上一把锁synchronized (account){if (account.money - withdrawMoney < 0) {System.out.println("抱歉,余额不足");return;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}account.money = account.money - withdrawMoney;nowMoney = nowMoney + withdrawMoney;System.out.println(this.account.name + "账户余额为:" + account.money);System.out.println(this.getName() + "手里的钱:" + nowMoney);}}
}

  此时运行结果为:


  由这个结果看出,此时线程已经安全。

线程同步之模拟银行取钱实例相关推荐

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

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

  2. 模拟银行取钱 (多线程操作的好处)

    (1)银行类 package test4; /**  * 银行账户  * @author user  *  */ public class Bank { private static double b ...

  3. java多线程学习二、安全与不安全示例:12306买票和银行取钱、java内存模型、内存可见性、线程同步块和方法

    文章目录 前言 1. 什么是块,分为几种 2. 静态块与构造块的区别 一. 举例说明:并发情况下,线程不安全 1. 示例1:unsafe12306取票 2. 示例2:unsafe银行取钱 二.线程不安 ...

  4. java多线程银行取钱_用java线程同步实现银行取款和存款。

    题目是:编写程序实现线程的同步.假设一个银行的ATM机,它可以允许用户存款也可以取款.现在一个账户上有200元,用户A和用户B都拥有在这个账户上存款和取款的权利.用户A将存入100元... 题目是:编 ...

  5. Java线程安全和线程同步——以银行取钱为例

    Java线程安全和线程同步(银行取钱案例) 一.线程安全问题 案例:银行多用户操作同一账户 public class SafeBank {public static void main(String[ ...

  6. 线程安全经典案例:银行取钱问题

    银行取钱的基本流程基本上可以分为如下几个步骤. (1)用户输入账户.密码,系统判断用户的账户.密码是否匹配. (2)用户输入取款密码 (3)系统判断账户余额是否大于取款余额 (4)如果余额大于取款余额 ...

  7. java银行安全性_Java使用同步方法解决银行取钱的安全问题案例分析

    本文实例讲述了Java使用同步方法解决银行取钱的安全问题.分享给大家供大家参考,具体如下: 一 点睛 与同步代码块对应,Java的多线程安全支持还提供了同步方法,同步方法就是使用synchronize ...

  8. c语言求出伍位数,简介 模拟银行的钱数大写输出例如345叁肆伍方法/步骤 首先打开VC++ 文件》》》新建 创建一个C++空白文档 先声明头文件复制代码 代码...

    简介 模拟银行的钱数大写输出例如 345 叁肆伍 方法/步骤 首先打开VC++ 文件>>>新建 创建一个C++空白文档 先声明头文件 #include 声明变量 char *p[10 ...

  9. java银行取款_Java写简单的银行取钱系统

    按ctrl+a 选中所有的代码删除,再复制下面的代码输入即可 import java.util.Scanner; public class 简单的银行取钱系统 //class的名字可以自己新建和这个一 ...

最新文章

  1. 气温上升影响数据中心节能
  2. 文件系统和磁盘挂载、卸载
  3. array python 交集_NMS原理(非极大值抑制)+python实现
  4. php代码显示灰色,哀悼日-实现网页变灰色的方法
  5. php 超大整数计算,PHP int 超大溢出整数的 加减运算函数,如果有更好的方法欢迎探讨...
  6. MySQL计算表字段长度LENGTH
  7. APM终端用户体验监控分析(下)
  8. r 语言ylim = c(0 1),今日R--条形图(barplot)
  9. mvc+EF实现简单的登陆功能
  10. 计算机录屏幕和声音的软件是什么,哪个录屏软件可以录内部声音?分享开启与调节的方法...
  11. 复旦计算机系统基础课件,复旦大学软件工程考研(MSE)计算机系统基础复习资料.ppt...
  12. CRM及协同办公高保真原型、审批管理、办公申请、工单管理、任务管理、日程管理、工作报告、签到考勤、客户管理、销售线索、商机管理、订单管理、账务管理、统计报表、回款管理、发票管理、报销管理、拜访跟进
  13. 八皇后算法—java
  14. 简单理解串行计算、并行计算、分布式计算、网格计算与云计算
  15. FCN(Fully Convolutional Network)与Unet:谈到语义分割不得不提的两个网络
  16. 【R】【课程笔记】04+05 数据预处理+收益率计算
  17. IDEA免费教育申请(不需要教育邮箱,只要你是学生!!!)
  18. 大数据开发方向分享:春招获蚂蚁金服、拼多多、华为(终端)、远景能源、华泰证券等offer
  19. fiddle android
  20. 【联邦学习+区块链】联邦学习与区块链

热门文章

  1. 基于selenium和autoit 实现B站视频自动上传功能
  2. 由全面战争与像素海盗想到的
  3. 鸡蛋的硬度(信息学奥赛一本通)
  4. u盘文件不显示却占用空间
  5. JZOJ 4245【五校联考6day2】er
  6. 2018-2019-2 20175327蜂凯南《Java程序设计》实验二
  7. 2021年3月8日 星期一 妇女节 霾 天津市区
  8. 红警2之尤里复仇 联机问题
  9. Qt在cmd窗口下编译工程遇到问题0xc0000135
  10. C++中const小结