A concurrent service can remain alive, consume CPU, and complete some requests while one operation waits forever. It can also have several threads actively reacting to one another without completing anything. In a priority-scheduled system, urgent work can be delayed because a low-priority thread owns the resource it needs.
These are different progress failures:
Correct synchronization must protect data and provide an acceptable progress policy. Mutual exclusion alone says who may enter now; it does not guarantee who enters next or how long any waiter can be delayed.
This chapter distinguishes starvation, livelock, and priority inversion, examines their causes and observable symptoms, and explains mitigation through fairness policies, backoff, priority inheritance, and priority ceilings.