Chapter 2 - Recipe #5: Synchronizing data access with read/write locks