线程安全分析
多个线程并发执行会带来安全问题,就好比搬家这项工作,虽然人多了干活会比较快,但是人多很容易损坏物件。在线程安全问题中,非常有名的问题就是银行取钱问题。
银行的取钱流程是这样的:
1.验证用户名和密码
2. 用户输入取款金额
3.系统判断余额是否大于取款金额,如果大于则取款成功;否则,取款失败。
4. 系统更新账户余额
这个流程看起来没有任何问题,但是如果放到多线程并发情况下,就有可能出现问题。比如:
假设你的账户有1000元,当你在柜台成功取出1000元时(注意此时系统还没有将账户余额改为0,账户余额还是为1000 )。同时你的女朋友在取款机也正在取款,取款机去查询账户余额,发现是1000元,于是又吐给你女朋友1000元。
然后柜台将你的账户余额更新为0,取款机随后也将你的账户余额更新为0。
就这样,我们成功的在1000元的账户里,取出了2000元。这显然是不合理的。
程序模拟
下面让我们写一个多线程程序来模拟多个人取钱操作。
首先封装一个账户类,这个账户有账号和余额两个属性:

线程安全分析
多个线程并发执行会带来安全问题,就好比搬家这项工作,虽然人多了干活会比较快,但是人多很容易损坏物件。在线程安全问题中,非常有名的问题就是银行取钱问题。
银行的取钱流程是这样的:
1.验证用户名和密码
2. 用户输入取款金额
3.系统判断余额是否大于取款金额,如果大于则取款成功;否则,取款失败。
4. 系统更新账户余额
这个流程看起来没有任何问题,但是如果放到多线程并发情况下,就有可能出现问题。比如:
假设你的账户有1000元,当你在柜台成功取出1000元时(注意此时系统还没有将账户余额改为0,账户余额还是为1000 )。同时你的女朋友在取款机也正在取款,取款机去查询账户余额,发现是1000元,于是又吐给你女朋友1000元。
然后柜台将你的账户余额更新为0,取款机随后也将你的账户余额更新为0。
就这样,我们成功的在1000元的账户里,取出了2000元。这显然是不合理的。
程序模拟
下面让我们写一个多线程程序来模拟多个人取钱操作。
首先封装一个账户类,这个账户有账号和余额两个属性: