Java基础-模拟多线程安全问题场景
案例要求:
实现思路:
实现模拟多线程安全性问题,比如银行余额1万元,两用户同时去取1万元,可能取出总共两万元,现在是模拟问题,后面会解决
Main方法:
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
public class Main {static Scanner sc = new Scanner(System.in);public static void main(String[] args) {Card card = new Card("ICBC-BC", 10000);new Operate("小明",card).start();new Operate("小王",card).start();}
}
Card方法:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {private String name;private int money;public void getMoney(int money){System.out.println("开始取钱"+money+"元");if(this.money>=money){System.out.println(name+"取钱成功,取钱金额为"+money);this.money-=money;System.out.println("余额为"+this.money);}else{System.out.println("取钱失败,余额不足");}}
}
Operate方法:
‘
public class Operate extends Thread {private Card card;public Operate(String name, Card card) {super(name);this.card = card;}@Overridepublic void run() {card.getMoney(10000);}
}
总结:
该Java程序模拟了多线程银行卡取款场景。Main类创建了一个初始余额10000元的ICBC-BC银行卡对象,并启动两个线程("小明"和"小王")同时进行取款操作。Card类封装了银行卡信息及取款逻辑,包含余额检查和扣款功能。Operate类继承Thread实现多线程操作,每个线程尝试取出10000元。由于未加同步控制,当两个线程并发执行时可能出现并发问题,导致余额异常。程序演示了多线程环境下共享资源访问可能引发的线程安全问题。