Skip to content
11 / 15

sync.Once, sync.Pool и sync.Map: когда они действительно уместны

Три инструмента из sync, каждый с узкой областью применения. sync.Once гарантирует, что функция выполнится ровно один раз, сколько бы горутин ни вызвали Do — стандартный способ ленивой инициализации; с Go 1.21 есть удобные OnceValue и OnceFunc. Важно: если функция запаникует, Once считает попытку состоявшейся и повторять не будет. sync.Pool — кеш временных объектов для снижения давления на сборщик мусора; ключевое ограничение в том, что пул очищается при каждой сборке мусора, поэтому он не годится ни для пула соединений, ни вообще для чего-либо, что обязано сохраняться. Применяют его к буферам в горячих путях, и только подтвердив выигрыш бенчмарком. sync.Map оптимизирована ровно под два сценария: ключ пишется один раз и читается многократно, либо разные горутины работают с непересекающимися ключами. Во всех остальных случаях обычная карта под RWMutex быстрее и типобезопаснее.

sync.Once, sync.Pool и sync.Map: когда они действительно уместны | JScriptiser