Spec-Zone.ru › Kotlin 1.9

createCleaner

kotlin-stdlib / kotlin.native.ref / createCleaner
Требования к платформе и версии: Native (1.9)
@ExperimentalNativeApi fun <T> createCleaner(
    resource: T, 
    cleanupAction: (resource: T) -> Unit
): Cleaner

Создаёт объект Cleaner, который выполняет cleanupAction с заданным resource некоторое время спустя после его освобождения.

Пример использования:

class ResourceWrapper {
    private val resource = Resource()

    private val cleaner = createCleaner(resource) { it.dispose() }
}

Когда ResourceWrapper становится неиспользуемым и освобождается, его cleaner также освобождается, а ресурс удаляется позже.

Не указано, на какой нити выполняется cleanupAction, а также может ли выполняться два или более действий очистки от разных очистителей параллельно.

Примечание: если resource ссылается (прямо или косвенно) на очиститель, то оба могут утечь, и cleanupAction не будет вызван в этом случае. Например, следующий код имеет утечку:

class LeakingResourceWrapper {
    private val resource = Resource()
    private val cleaner = createCleaner(this) { it.resource.dispose() }
}

В этом случае аргумент очистителя (LeakingResourceWrapper) не может быть освобождён, пока cleanupAction (it.resource.dispose()) не будет выполнен, что может произойти только строго после освобождения очистителя, что не может произойти до тех пор, пока LeakingResourceWrapper не будет освобождено. Таким образом, требования к освобождению объектов противоречат друг другу в этом случае, что не может быть обработано корректно. Действие очистки не выполняется, и очиститель и его аргумент могут утечь (в зависимости от реализации). Та же проблема возникает, когда cleanupAction захватывает значение, которое ссылается (прямо или косвенно) на очиститель:

class LeakingResourceWrapper {
    private val cleaner = createCleaner(...) {
        doSomething()
        ...
    }

    private fun doSomething() {
        ...
    }
}

В приведённом выше примере лямбда-выражение для очистки неявно захватывает объект this, чтобы вызвать doSomething().

cleanupAction не должен использовать @ThreadLocal глобальные переменные, поскольку он может быть выполнен на другой нити.

Если cleanupAction вызывает исключение, поведение не определено.

Очистители не могут использоваться для выполнения действий во время завершения программы:

  • очистители, на которые ссылаются из глобальных переменных, вообще не будут собраны сборщиком мусора,
  • очистители, которые становятся нессылочными незадолго до выхода из main(), могут не быть собраны сборщиком мусора, потому что сборщик мусора может не успеть запуститься.

Параметры

resource - объект, для которого необходимо выполнить cleanupAction

cleanupAction - действие очистки для выполнения на resource. Не должно ничего захватывать.

© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.native.ref/create-cleaner.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API