Lock.withLock和Kotlin中的同步之间的区别

时间:2017-12-08 20:41:09

标签: kotlin

之间是否存在差异(除了偏好)
someLock.withLock {
    sharedResource.operation()
}

synchronized(someLock) {
    sharedResource.operation()
}

在Kotlin?

2 个答案:

答案 0 :(得分:8)

扩展程序withLock适用于LockReentrentLock个实例,而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实例。