package day11; public class ThreadSafeDemo { public static void main(String[] args) { // 目标:模拟线程安全问题。 // 1、设计一个账户类:用于创建小明和小红的共同账户对象,存入10万。 Count acc = new Count("acm",100000); // 2、设计线程类:创建小明和小红两个线程,模拟小明和小红同时去同一个账户取款10万。 new DrawThread("小明", acc).start(); new DrawThread("小红", acc).start(); } }
package day11; public class DrawThread extends Thread { private Count acc;// 记住线程对象要处理的账户对象。 public DrawThread(String name, Count acc) { super(name); this.acc = acc; } @Override public void run() { acc.getMoney(100000); } }
package day11; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Count { //账号 private String name; //余额 private double money; // 小明和小红都到这里来了取钱 public void getMoney(double money) { String name = Thread.currentThread().getName(); //判断是否余额是否足够 if (this.money >= money) { System.out.println(name + "取款成功,取了:" + money ); this.money -= money; System.out.println( "取钱成功,余额剩余:" + this.money); } else { System.out.println(name + "取款失败,余额不足"); } } }
结论:由于线程没有添加任何限制,会引发线程危机