Spec-Zone.ru › Kotlin 2

createCleaner

kotlin-stdlib/kotlin.native.ref/createCleaner

Начиная с Kotlin: 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–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.native.ref/create-cleaner.html

Spec-Zone.ru

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