tgoop.com/go_interview_lib/583
Last Update:
💬 В Go есть функция runtime.SetFinalizer
, позволяющая привязать финализатор к объекту. Как она работает и в каких случаях использование финализаторов может быть небезопасным? Приведите пример ситуации, в которой финализатор может не сработать.runtime.SetFinalizer
позволяет привязать функцию (финализатор) к объекту, которая будет выполнена, когда сборщик мусора сочтёт объект неиспользуемым. Финализатор запускается сборщиком мусора, но его выполнение зависит от цикла GC, поэтому точное время выполнения не гарантируется.
Использование финализаторов может быть небезопасным из-за нескольких факторов:
1. Финализаторы могут сработать не сразу после того, как объект станет неиспользуемым, а в зависимости от цикла GC.
2. Tiny objects: объекты размером менее 16 байт и без указателей (так называемые "tiny objects") могут группироваться вместе, и если хотя бы один объект в группе ещё используется, финализаторы для остальных объектов могут не сработать.
3. Ограничение на привязку к началу блока памяти: финализатор можно установить только для указателя, указывающего на начало блока памяти объекта. Если привязать финализатор к внутреннему полю структуры, программа завершится с ошибкой.
В следующем примере FourBytes
является "tiny object", и финализатор может не сработать, если другие объекты из этой же группы продолжают использоваться:
type FourBytes struct {
A byte; B byte; C byte; D byte
}
func final() {
a := &FourBytes{}
runtime.SetFinalizer(a, func(a *FourBytes) {
fmt.Println("Финализатор FourBytes вызван")
})
}
func main() {
final()
runtime.GC()
time.Sleep(time.Millisecond)
}
В этом коде финализатор может либо сработать, либо нет, в зависимости от того, как Go управляет группой маленьких объектов. Это делает использование финализаторов в Go непредсказуемым, и в большинстве случаев рекомендуется использовать явное освобождение ресурсов с методами, такими как
Close
или Dispose
.BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/583