synchronizing data access with read/write locks
modifying lock fairness
using multiple conditions in a lock