Do not lock again if already locked. Do not unlock if not locked by you. Do not spend large amounts of time in critical section. E.g. don't go on vacation. Invented by Dijkstra.
Semaphores are simple and elegant and allow the solution of many interesting problems.
They do a lot more than just mutual exclusion. Show why there can never be more than one process buying milk at once. They are implemented in the same way as regular semaphores except multiple V's will not increase the semaphore to anything greater than one. Embody both exclusion and waiting. Correctness is easy to determine.