• 线程安全问题(模拟取钱案例)


    线程安全问题出现的原因?

    存在多线程并发

    同时访问共享资源

    存在修改共享资源

    案例(让系统出现线程安全问题)

    A和B有 一个共同账户,余额为10万元,模拟两个人同时取款

    分析

    需要提供一个账户类,创建一个账户对象代表两人共享账户

    需要定义一个线程类,线程类可以处理账户对象

    创建2个线程对象,传入同一个账户对象

    启动两个线程,去同一个账户中取钱10万。

    故意先让前先取出来,在进行金额更新

    创建账户类

    1. package 多线程案例;
    2. public class Account {
    3. private String cardid; //卡号
    4. private double money;//账户余额
    5. /**
    6. * @return the cardid
    7. */
    8. public String getCardid() {
    9. return cardid;
    10. }
    11. /**
    12. * @param cardid the cardid to set
    13. */
    14. public void setCardid(String cardid) {
    15. this.cardid = cardid;
    16. }
    17. /**
    18. * @return the money
    19. */
    20. public double getMoney() {
    21. return money;
    22. }
    23. /**
    24. * @param money the money to set
    25. */
    26. public void setMoney(double money) {
    27. this.money = money;
    28. }
    29. public Account(String cardid, double money) {
    30. super();
    31. this.cardid = cardid;
    32. this.money = money;
    33. }
    34. public Account() {
    35. super();
    36. }
    37. public void drawMoney(double money) {
    38. System.out.println(Thread.currentThread().getName()+"正在取款");
    39. if(this.money>=money) {
    40. System.out.println(Thread.currentThread().getName()+"取款"+money);
    41. this.money-=money;
    42. System.out.println("卡内还剩"+this.money);
    43. }else {
    44. System.out.println("余额不足");
    45. }
    46. }
    47. }

    创建线程类

    1. package 多线程案例;
    2. //线程类
    3. public class MyThread extends Thread{
    4. private Account ac;//接用户对象
    5. public MyThread(Account ac,String name) {
    6. // TODO Auto-generated constructor stub
    7. super(name);
    8. this.ac = ac;
    9. }
    10. @Override
    11. public void run() {
    12. // TODO Auto-generated method stub
    13. super.run();
    14. ac.drawMoney(100000);
    15. }
    16. }

    主函数

    1. package 多线程案例;
    2. public class Test {
    3. public static void main(String[] args) {
    4. //创建一个共同账户
    5. Account a1=new Account("aa-123",100000); //公用一张卡存入10万
    6. //创建线程对象,并运行
    7. new MyThread(a1,"A").start();
    8. new MyThread(a1,"B").start();
    9. }
    10. }

    控制台输出为

    A正在取款
    B正在取款
    A取款100000.0
    B取款100000.0
    卡内还剩0.0
    卡内还剩-100000.0

  • 相关阅读:
    kali安装dvwa
    图解redis(二)——持久化篇
    设计模式之代理模式(Proxy Pattern)
    如何使用选择工具
    pytorch nn.utils.rnn.pack_padded_sequence 分析
    Emmet语法
    Qt Example各例子功能说明(三)
    将asp.net core程序部署到Linux服务器上(1)
    TCP协议详细图解(含三次握手、滑动窗口等十大机制)
    Java 高级特性の反射
  • 原文地址:https://blog.csdn.net/m0_64365315/article/details/125884636