Doing Without Locks
Locking is simple at the coarse granularity or at the edge of a system. It becomes increasingly complex to get right when you have to deal with lots of locks, but can still be useful if you're careful. In general, however, locks are most useful for implementing higher-level synchronization models.
In part 2 of this series, we'll take a look at some data structures that support concurrent users without locking. These are generally quite complex to understand, and even harder to prove correct, but when implemented correctly can be very efficient indeed.