之间是否存在差异(除了偏好)
someLock.withLock {
sharedResource.operation()
}
和
synchronized(someLock) {
sharedResource.operation()
}
在Kotlin?
答案 0 :(得分:8)
扩展程序withLock
适用于Lock
个ReentrentLock
个实例,而synchronized
可用于任何对象。
val lock = ReentrantLock()
fun syncWithLockTest(): Int = lock.withLock { 123 }
val anyLock = Any()
fun syncWithArbitraryObjTest(): Int = synchronized(anyLock) { 123 }
请注意synchronized
是Kotlin中的一个函数,它返回一个值。这使它比Java的synchronized关键字更强大。
从技术上讲,只要您对需要彼此同步的所有相关代码块使用相同的对象,它就不会对您锁定的对象产生影响
答案 1 :(得分:3)
值得在@ s1m0nw1的答案中明确添加它们可以具有不同的语义,具体取决于您使用的锁。引用the Lock
documentation:
Lock类还可以提供与隐式监视器锁定完全不同的行为和语义,例如保证顺序,不可重用或死锁检测。如果实现提供了这种特殊的语义,则实现必须记录这些语义。
请注意,Lock实例只是普通对象,它们本身可以用作同步语句中的目标。获取Lock实例的监视器锁定与调用该实例的任何lock()方法没有指定的关系。建议避免混淆,除非在自己的实现中使用,否则不要以这种方式使用Lock实例。