Of course, many of them weren't on the first try. Some died because I inadvertently typed the wrong function name when I had a read lock on the object, so I got a NULL pointer exception. This is actually good, because it means that the least bit of unit testing will detect an attempt to write an object with a read lock.
It's just annoying to be hoist by my own petard given how much code I had to rewrite. Mistakes were pretty much guaranteed. :)