通过模拟取钱过程演示线程安全问题。
一般取钱过程:
- 用户输入账户、密码,系统判断用户的账户、密码是否匹配。
- 用户输入取款金额。
- 系统判断账户余额是否大于取款金额。
- 如果余额大于取款金额,则取款成功;如果余额小于取款金额,则取款失败。
在模拟过程中就模拟后面三步,没有模拟账户密码验证过程。
创建一个账户
创建一个取钱用户,且继承Thread创建线程类
再创建模拟取钱主方法
我们先测试一下查看结果:
很明显张三和李四都成功取出了说明多线程环境下容易出现线程安全问题。
那么来解决多线程安全问题,我目前学习了三种解决多线程安全问题的方法
第一种:使用同步代码块
为了解决线程安全问题,Java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用
方法就是同步代码块。