存在多线程并发
同时访问共享资源
存在修改共享资源
A和B有 一个共同账户,余额为10万元,模拟两个人同时取款
分析
需要提供一个账户类,创建一个账户对象代表两人共享账户
需要定义一个线程类,线程类可以处理账户对象
创建2个线程对象,传入同一个账户对象
启动两个线程,去同一个账户中取钱10万。
故意先让前先取出来,在进行金额更新
创建账户类
- package 多线程案例;
-
- public class Account {
- private String cardid; //卡号
- private double money;//账户余额
- /**
- * @return the cardid
- */
- public String getCardid() {
- return cardid;
- }
- /**
- * @param cardid the cardid to set
- */
- public void setCardid(String cardid) {
- this.cardid = cardid;
- }
- /**
- * @return the money
- */
- public double getMoney() {
- return money;
- }
- /**
- * @param money the money to set
- */
- public void setMoney(double money) {
- this.money = money;
- }
- public Account(String cardid, double money) {
- super();
- this.cardid = cardid;
- this.money = money;
- }
- public Account() {
- super();
- }
- public void drawMoney(double money) {
- System.out.println(Thread.currentThread().getName()+"正在取款");
- if(this.money>=money) {
- System.out.println(Thread.currentThread().getName()+"取款"+money);
- this.money-=money;
- System.out.println("卡内还剩"+this.money);
-
- }else {
- System.out.println("余额不足");
- }
-
-
-
- }
-
-
-
- }
创建线程类
- package 多线程案例;
-
- //线程类
- public class MyThread extends Thread{
- private Account ac;//接用户对象
- public MyThread(Account ac,String name) {
- // TODO Auto-generated constructor stub
- super(name);
- this.ac = ac;
-
- }
-
- @Override
- public void run() {
- // TODO Auto-generated method stub
- super.run();
- ac.drawMoney(100000);
-
- }
-
-
-
- }
主函数
- package 多线程案例;
-
- public class Test {
-
- public static void main(String[] args) {
- //创建一个共同账户
- Account a1=new Account("aa-123",100000); //公用一张卡存入10万
- //创建线程对象,并运行
- new MyThread(a1,"A").start();
- new MyThread(a1,"B").start();
-
- }
-
- }
控制台输出为
A正在取款
B正在取款
A取款100000.0
B取款100000.0
卡内还剩0.0
卡内还剩-100000.0