when locking a pair of objects, the object with the lesser memory address is always locked first. the pair is unlocked in the opposite order.
this system makes it possible for an object that forms part of a tree to be safely recursively destroyed without using recursion.