想法:创建一个内联的便利函数来同步“内联”对象的内部锁定上的函数调用:
public inline fun <T> intrinsicSync(block: () -> T): T {
return synchronized(intrinsicLockOfTheObjectUsingTheFunction) {
block()
}
}
fun someFunction(parameter: SomeClass) {
intrinsicSync(sharedResource.operation(parameter))
}
这可能吗?如果没有,是否有不同但同样方便的方式?我承认
fun someFunction(parameter: SomeClass) {
synchronized(this) {
sharedResource.operation(parameter)
}
}
不是世界上最大的麻烦,但我仍然想知道是否有可能做出类似我想象的事情。
答案 0 :(得分:2)
你能做的最多就是给函数一个接收器(即使它成为一个扩展函数):
public inline fun <T> Any.intrinsicSync(crossinline block: () -> T): T {
// ^ within this function, `this` refers to the receiver
return synchronized(this, block)
}
然后在成员函数中,您可以执行
this.intrinsicSync { sharedResource.operation() }
从推断出this
后,您应该可以将其缩短为
intrinsicSync { sharedResource.operation() }
请记住,扩展函数不能影子成员函数,因此如果此对象具有相同签名的其他函数,则不会选择扩展函数。
在你的情况下,这似乎不太可能。