Давайте отойдем от базуки и птички с ее крыльями. Ну никак не вкладывается махание крыльями в синхронизацию.
Живой пример:
Есть некая СУБД.
Есть некая запись.
Есть несколько процессов работающих с этой записью.
Чтобы привести конкретный пример - пожайлуста.
Банковский счет (БСч)
На Бсч лежит 1млн эквивалента.
Некий процесс (поток) П1 обращается к БСч и видит там 1 млн.
Другой поток П2 обращается к БСч и видит там 1 млн.
П1 снимает со счета половину от 1 млн.
П2 снимает со счета 0.75 от 1 млн.
Все! Банкиры в тюрьме!
Пытаемся исправить ситуацию.
П1 блокирует счет на время выполнения операций по состоянию БСч.
П2 ждет окончания блокировки. И только после окончания блокировки П2 получает доступ к состоянию БСч
Все. И волки целы и овцы сыты
Это то же синхронизация.
два потока работают до возникновения "критической ситуации" независимо, работают critical section. При возникновении критического события поток, ждет окончания "блокировки".