bounded waiting
Suppose the bathroom rule is fair in spirit — whoever is free goes in — but in practice, every time you reach for the door, someone faster squeezes in ahead of you, again and again, and you stand there for hours. Progress is technically satisfied (the room is never idle while someone waits) yet you, specifically, never get in. Bounded waiting is the requirement that fixes this: once a thread has asked to enter its critical section, there is a fixed limit on how many times other threads are allowed to enter ahead of it before its own request is finally granted.
The key word is bounded. Bounded waiting does not promise you go next, and it does not promise any particular speed; it only promises that the number of times you can be overtaken is finite and known in advance — say, at most n-1 times for n threads. After that bound is reached, it must be your turn. This is precisely the guarantee that rules out starvation, the situation where an unlucky thread waits forever while a steady stream of others keeps cutting in line. Many simple correct-looking locks provide mutual exclusion and progress but quietly allow unbounded overtaking under heavy contention.
Bounded waiting is the third and subtlest critical-section requirement, and it is the one that costs the most to provide. Guaranteeing it usually requires the entry protocol to remember who is waiting and enforce some order — a queue, a ticket number, a round-robin sweep. Plain spinlocks and simple test-and-set locks typically do not guarantee bounded waiting on their own: under contention the same lucky thread can grab the lock repeatedly. Fairer constructs (ticket locks, queue-based locks, fair mutexes) add bookkeeping precisely to earn this guarantee, trading a little speed for the promise that nobody waits forever.
A ticket lock is like a deli counter: each arriving thread takes the next number, and the lock is granted strictly in number order. No matter how often others arrive, a thread holding ticket 47 waits behind at most the holders of 45 and 46 — a hard bound — so it can never be starved.
Bounded waiting caps how many times you can be overtaken — that's what kills starvation.
Plain test-and-set / spinlocks do not by themselves guarantee bounded waiting; under contention one thread can keep winning. Fairness must be added on purpose (e.g. a ticket or queue).