关于线程安全问题,有一个经典案例:银行取钱问题。

假设有一个账户,有两个线程从账户里取钱,如果余额大于取钱金额,则取钱成功,反之则失败。

下面来看下线程不安全的程序会出什么问题。

账户类:

 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 }
View Code

相关文章:

  • 2021-12-04
  • 2021-12-07
  • 2022-01-12
  • 2022-02-01
  • 2021-09-24
  • 2021-03-31
  • 2021-08-09
  • 2022-01-26
猜你喜欢
  • 2021-11-27
  • 2022-02-07
  • 2022-02-07
  • 2019-01-04
  • 2021-11-27
  • 2022-01-13
相关资源
相似解决方案