假设我有一个像这样的包装对象:
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
吗?