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


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

    存在多线程并发

    同时访问共享资源

    存在修改共享资源

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

    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

  • 相关阅读:
    vue-:visible.sync的作用
    HazelEngine 学习记录 - Single Shader 2D Renderer
    Android开发基础——Activity基本用法
    微服务-kubernetes安装
    ERROR: your rosdep installation has not been initialized yet
    CV学习——day32 读论文:顶会ICCV · 会议CV——2021 Swin Transformer
    无人机如何做到自动巡检?关键技术步骤分析
    ubuntu 20.04 Kimera semantic 运行记录
    python之Flask入门
    王老师 linux c++ 通信架构 笔记(三)安装 xftp、
  • 原文地址:https://blog.csdn.net/m0_64365315/article/details/125884636