Fine-grained locking protects smaller portions of shared work or state with more numerous locks. Compared with coarse-grained locking, it allows more threads to proceed concurrently, but increases implementation complexity and synchronization overhead. section 9.2.1
Its main performance use is reducing contention: partition critical work so that threads hold individual locks for shorter periods rather than queueing behind one broad lock. This can reduce convoying, where a slow lock holder delays many waiting threads, increases latency, lowers throughput, and leaves CPUs underutilized. Fine-grained locking does not eliminate these problems, and wait-free synchronization may be preferable for strict latency requirements. section 8.2.3 section 9.2.1
Figure 9.2 The OS runs multiple threads at the same time (but not simultaneously) on a single CPU core by context-switching between them. In this example, every thread is run for exactly 4 milliseconds, and then the OS switches to another thread. In real-world systems, a thread might block to wait for I/O, for example, causing the OS to switch to another thread more quickly.
Use the scheduling figure to connect lock contention with the physical cost of thread execution and context switching on a single CPU core. section 9.2.1

