\$s +=====================================================+ | CPU | +--------------------------+--------------------------+ | thread 1 | thread 2 | +==========================+==========================+ | - ... | | | - read $s's refcount | | | - $s is locked | | | - refcount is read | | | - $s is unlocked | | | - add one | | +--------------------------+--------------------------+ | | - ... | | | - read $s's refcount | | | - $s is locked | | | - refcount is read | | | - $s is unlocked | | | - add one | | | - write $s's refcount | | | - $s is locked | | | - write $s's refcount | | | - $s is unlocked | | | - ... | +--------------------------+--------------------------+ | - write $s's refcount | | | - $s is locked | | | - write $s's refcount | | | - $s is unlocked | | | - ... | | +==========================+==========================+ => refcount is wrong <=