Перейти к содержимому
5 / 15

sync.Mutex и RWMutex: когда мьютекс лучше канала

Известный совет «не общайтесь через разделяемую память, разделяйте память через общение» часто понимают как «каналы всегда лучше», и это неверно. Правило проще: каналы — для передачи владения и координации, мьютекс — для защиты состояния. Счётчик, кеш, карта соединений защищаются мьютексом, и попытка сделать то же каналом даёт медленнее и запутаннее. sync.Mutex — обычная взаимная блокировка; sync.RWMutex разрешает много одновременных читателей либо одного писателя, но выигрывает только при явном перевесе чтений: у него дороже операции и он подвержен голоданию писателя. Обязательные правила: мьютекс нельзя копировать (go vet ловит это как «passes lock by value»), поэтому методы объявляют на указателе; разблокировку делают через defer сразу после захвата; и никогда не вызывают чужой код под блокировкой — это прямой путь к взаимной блокировке. Нулевое значение мьютекса уже готово к работе, конструктор не нужен.

sync.Mutex и RWMutex: когда мьютекс лучше канала | JScriptiser