TL;DR
複数の処理(スレッドやゴルーチンなど)を適切に制御し、競合やデータの不整合を防ぐための仕組み。
なぜ必要か
Wikipedia によると、複数のスレッドがクリティカルセクションを同時に実行すると、変数の値はコンテキストスイッチのタイミングで変わり、予測できなくなる(競合状態)。認証してから口座にアクセスするように、処理の順序を守らせたい場面もある。Fork-Join model や生産者・消費者のように、処理が互いを待つパターンでも同期が必要になる。
例
注意点
同期の仕方によっては、デッドロックやstarvation、優先度の逆転が起きる。スピンロックのように条件を繰り返し確かめるビジーウェイトは、他の処理が使える CPU 時間を消費する。バリアでは、先に着いたスレッドが他のスレッドを待つ時間が必ず生じる。