zoukankan      html  css  js  c++  java
  • 不安全线程取钱

     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 }

    输出结果

  • 相关阅读:
    console.log眼见不一定为实
    播放器
    js变量
    js函数
    js数组
    设置默认浏览器
    this.$nextTick()用法
    进程理论+创建进程的两种方法+进程join方法+进程间数据相互隔离
    风险可视化项目记录1
    HTML笔记
  • 原文地址:https://www.cnblogs.com/wooroc/p/15807882.html
Copyright © 2011-2022 走看看