ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

不安全线程取钱

2022-01-15 20:02:10  阅读:116  来源: 互联网

标签:BigDecimal WithDrawMoney 安全 线程 drawMoney new balance bank


 1 package 多线程练习;
 2 
 3 import com.sun.javafx.sg.prism.web.NGWebView;
 4 
 5 import java.math.BigDecimal;
 6 
 7 /*
 8    模拟两个人同时取钱的情况
 9  */
10 public class UnSafeAccount {
11     public static void main(String[] args) {
12         Bank bank = new Bank("12345", new BigDecimal("100"));
13         WithDrawMoney xiaoming = new WithDrawMoney(bank, new BigDecimal("50"), "小明");
14         WithDrawMoney xiaomingxf = new WithDrawMoney(bank, new BigDecimal("100"), "小明媳妇");
15         xiaoming.start();
16         xiaomingxf.start();
17 
18     }
19 }
20 
21 
22 /*
23    银行类
24  */
25 class Bank {
26     String cardNumer;    // 卡号
27     BigDecimal balance;  // 余额  小tip:Java中用BigDecimal 来表示金钱类型
28 
29     public Bank(String cardNumer, BigDecimal balance) {
30         this.cardNumer = cardNumer;
31         this.balance = balance;
32     }
33 
34 }
35 
36 class WithDrawMoney extends Thread {
37     //  模拟正式环境全部私有
38     Bank bank;
39     BigDecimal nowMoney = new BigDecimal("0");   // 手里的钱
40     BigDecimal drawMoney;  // 取走的钱
41 
42     // 构造方法
43     public WithDrawMoney(Bank bank, BigDecimal drawMoney, String name) {
44         super(name);  // 调用父类的只能用在第一行
45         this.bank = bank;
46         this.drawMoney = drawMoney;
47     }
48 
49     @Override
50     public void run() {
51         if (bank.balance.subtract(drawMoney).compareTo(BigDecimal.ZERO) == -1) {
52             System.out.println(this.getName() + " 钱不够了,取钱失败");  // 线程类中this.getName() ==  Thread.currentThread.getName()
53             return;
54         }
55 
56         try {
57             Thread.sleep(500);
58         } catch (InterruptedException e) {
59             e.printStackTrace();
60         }
61 
62         nowMoney = nowMoney.add(drawMoney);                       // 手里的钱
63         bank.balance = (bank.balance.subtract(drawMoney));        // 卡上余额 subtract 减法  add 加法
64         System.out.println(this.getName() + " 手里有 " + nowMoney + "钱");
65         System.out.println("卡上余额:" + bank.balance);
66     }
67 
68 
69 }

 

 

输出结果

 

标签:BigDecimal,WithDrawMoney,安全,线程,drawMoney,new,balance,bank
来源: https://www.cnblogs.com/wooroc/p/15807882.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有