1

假设我有一个像这样的包装对象:

private val CLEANER = java.lang.ref.Cleaner.create()

internal typealias Ptr = Long
private external fun acquireResource(): Ptr
private external fun disposeResource(nativePtr: Ptr)
/* ... */

class Resource private constructor (private val nativePtr: Ptr): Closeable, AutoCloseable {
    companion object {
        fun create(): Resource {
            return Resource(acquireResource())
        }
    }

    private val cleanable = CLEANER.register(this, object: Runnable {
        private val nativePtr = this@Resource.nativePtr

        override fun run() {
            disposeResource(nativePtr)
        }
    })

    override fun close() {
        cleanable.clean()
    }

    /* ... */
}

现在假设我想编写一个方法internal fun release(): Ptr,让Resource放弃所有权nativePtr然后返回它:换句话说,当Resource我调用release的对象被垃圾收集时,它的nativePtr指针不应该被释放。Resource(我打算在调用之后不应该使用该对象release,尽管我看不到任何强制执行此操作的方法。)这将允许我将 传递Ptr给一个 API,该 API 将从那时起管理其生命周期。

我该如何编写release,最好以原子/线程安全的方式编写?它甚至兼容Cleaner吗?

4

0 回答 0