关于线程安全问题,有一个经典案例:银行取钱问题。
假设有一个账户,有两个线程从账户里取钱,如果余额大于取钱金额,则取钱成功,反之则失败。
下面来看下线程不安全的程序会出什么问题。
账户类:
1 public class Account { 2 3 public int balance = 10;//账户余额 4 5 6 7 //取钱的方法 8 9 public void draw(int money){ 10 11 if (balance >= money) { 12 13 //此处让线程Thread-1睡眠1秒,是为了模拟线程不安全造成的错误 14 15 if ("Thread-1".equals(Thread.currentThread().getName())) { 16 17 try { 18 19 Thread.sleep(1000); 20 21 } catch (InterruptedException e) { 22 23 e.printStackTrace(); 24 25 } 26 27 } 28 29 30 31 balance = balance - money; 32 33 System.out.println(Thread.currentThread().getName()+"取钱成功,余额:"+balance); 34 35 }else{ 36 37 System.out.println("取钱失败,余额不足。余额:"+balance); 38 39 } 40 41 } 42 43 }