Ben 的担心是没有必要的,取余额的操作并不对 balance 变量进行设置,它是一个原子性的只读操作。即使在访问 balance 变量时有其他设置操作在进行,解释器也会很好地处理这一状况,所以就算不对 balance 进行串行化,也可以正确地获取 balance 的值。
为了验证以上的推论,假设现在有余额为 100 的银行帐号,对于 withdraw 、 deposit 和 balance 三种操作,可能出现的并行情况有两种(因为 withdraw 和 deposit 已经进行了串行化,所以这两个操作的并行情况不可能出现):
((protected withdraw) 50) 操作,另一个进程并行访问 balance 变量((protected deposit) 35) 操作,另一个进程并行访问 balance 变量这两种并行共有四种可能的运行序列(每个并行两种):
序列一: withdraw –> balance
序列二: balance –> withdraw
序列三: deposit –> balance
序列四: balance –> deposit
对于运行序列一, withdraw 将银行帐号的余额设置为 50 ,然后 balance 返回 50 。
对于运行序列二 , balance 返回帐号 100 ,然后 withdraw 将银行帐号设置为 50 。
对于运行序列三 , deposit 将银行帐号的余额设置为 135 ,然后 balance 返回 135 。
对于运行序列四 , balance 返回余额 100 ,然后 deposit 。
可以看到,在以上四种运行序列中,对 balance 的访问都不会造成任何的并发错误,而 balance 操作也可以正确地返回帐号当时的余额。