Exercise 3.41. Ben Bitdiddle worries that it would be better to implement the bank account as follows (where the commented line has been changed): (define (make-account balance) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds")) (define (deposit amount) (set! balance (+ balance amount)) balance) ;; continued on next page (let ((protected (make-serializer))) (define (dispatch m) (cond ((eq? m 'withdraw) (protected withdraw)) ((eq? m 'deposit) (protected deposit)) ((eq? m 'balance) ((protected (lambda () balance)))) ; serialized (else (error "Unknown request -- MAKE-ACCOUNT" m)))) dispatch)) ———————————————————————————————————————————————————————————————————————— Given that the only changes to the balance are through the withdraw and deposit procedures, which never leave the balance in an anomalous state, there should be no concern, unless set! itself cannot be treated as atomic. If the balance were more complicated than a single number, or if the implementation were such that it is possible to read an inconsistent state during the execution of a set! call, then Ben would be correct.