Java之同步代码块实现取钱实例
来源:互联网 发布:相册制作软件下载 编辑:程序博客网 时间:2024/06/05 17:25
package 线程同步;public class Account {// 封装账号编号、账号余额的两个成员变量private String accountNo;private double balance;public Account() {}// 构造器public Account(String accountNo, double balance) {this.accountNo = accountNo;this.balance = balance;}public String getAccountNo() {return accountNo;}public void setAccountNo(String accountNo) {this.accountNo = accountNo;}public double getBalance() {return balance;}public void setBalance(double balance) {this.balance = balance;}// 下面两个方法根据accountNo来重写hashCode()和equals()方法public int hashCode() {return accountNo.hashCode();}public boolean equals(Object obj) {if (this == obj)return true;if (obj != null && (obj.getClass() == Account.class)) {Account target = (Account) obj;return target.getAccountNo().equals(accountNo);}return false;}}
package 线程同步;public class DrawThread extends Thread {// 模拟用户账号private Account account;// 当前取钱线程所希望取的钱数private double drawAmount;public DrawThread(String name, Account account, double drawAmount) {super(name);this.account = account;this.drawAmount = drawAmount;}// 当多个线程修改同一个共享数据时,将涉及到数据安全问题public void run() {// 使用account作为同步监视器,任何线程进入下面同步进程块之前// 必须先获得对account账户的锁定---其他线程无法获得说、锁,也无法修改它// 这种做法符合:“加锁->修改->释放锁”的逻辑synchronized (account) {// 账户余额大于或等于取钱数if (account.getBalance() >= drawAmount) {// 吐出钞票System.out.println(getName() + "取钱成功!吐出钞票:" + drawAmount);try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}// 修改余额account.setBalance(account.getBalance() - drawAmount);System.out.println("\t余额为:" + account.getBalance());}else{System.out.println(getName()+"取钱失败!余额不足!");}}//同步代码块结束,该线程释放同步锁}}
package 线程同步;public class Test {public static void main(String[] args) {//创建一个账户Account acct = new Account("123456",1000);//模拟两个线程对同一个账户取钱new DrawThread("张三",acct,800).start();;new DrawThread("李四",acct,800).start();;}}
运行结果:
0 0
- Java之同步代码块实现取钱实例
- 同步代码块应用之取钱问题、线程安全问题之线程同步机制(同步函数)
- JAVA同步代码块
- Java用同步代码块实现线程同步
- java线程安全之同步函数和同步代码块
- java多线程-多线程同步代码块-银行存款实例-锁synchronized
- 同步代码块同步函数实例
- java同步代码块 实现的买票功能
- JAVA 同步代码块synchronized
- [java]线程--同步代码块
- Java-线程$同步代码块
- java synchronized(同步代码块)
- 12.Java同步代码块
- 线程安全问题(银行取钱问题)、同步代码块、同步方法
- java学习之:同步代码块的理解
- java同步方法和同步代码块
- JAVA 同步代码块和同步函数
- java同步代码块和同步函数
- [iOS]仿微博视频边下边播之封装播放器
- JSP表单的发送
- 基于Visual Studio AddIns(插件)的形式开发的C#及JS的代码注释工具
- 命名空间
- 《大话设计模式》-- 第24个 职责链模式
- Java之同步代码块实现取钱实例
- 对于sqldependency类的使用(通过它来监听数据库的变化)
- Bootstrap 元素居中
- 数据结构之二叉搜索树和二叉平衡树学习笔记
- java二叉树非递归之前序遍历
- 看完9个笑话 顿悟9个人生道理
- 2016.10.27 函数特性
- 复选框(checkbox)全选/全不选/反选代码
- 2009 Multi-University Training Contest 1 - Host by TJU