线程安全分析

   多个线程并发执行会带来安全问题,就好比搬家这项工作,虽然人多了干活会比较快,但是人多很容易损坏物件。在线程安全问题中,非常有名的问题就是银行取钱问题。

  银行的取钱流程是这样的:

      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元。这显然是不合理的。

程序模拟

    下面让我们写一个多线程程序来模拟多个人取钱操作。

    首先封装一个账户类,这个账户有账号和余额两个属性:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值