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

Eve*_*sle 12 kotlin

两者之间是否存在差异(除了偏好)

someLock.withLock {
    sharedResource.operation()
}
Run Code Online (Sandbox Code Playgroud)

synchronized(someLock) {
    sharedResource.operation()
}
Run Code Online (Sandbox Code Playgroud)

在科特林?

s1m*_*nw1 12

扩展withLock适用于Lock类似的实例ReentrantLock,而synchronized可以与任何对象一起使用.

val lock = ReentrantLock()
fun syncWithLockTest(): Int = lock.withLock { 123 }

val anyLock = Any()
fun syncWithArbitraryObjTest(): Int = synchronized(anyLock) { 123 }

Run Code Online (Sandbox Code Playgroud)

注意,这synchronized是Kotlin中的一个返回值的函数.这使它比Java的synchronized关键字更强大.从技术上讲,只要您对需要彼此同步的所有相关代码块使用相同的对象,它就不会对您锁定的对象产生影响.


Ale*_*nov 6

值得在 @s1m0nw1 的答案中明确添加它们可以具有不同的语义,具体取决于您使用的锁。引用文档Lock

Lock 类还可以提供与隐式监视器锁完全不同的行为和语义,例如保证顺序、不可重入使用或死锁检测。如果实现提供了此类专门的语义,那么该实现必须记录这些语义。

请注意,Lock 实例只是普通对象,它们本身可以用作同步语句中的目标。获取 Lock 实例的监视器锁与调用该实例的任何 lock() 方法没有指定的关系。为了避免混淆,建议您永远不要以这种方式使用 Lock 实例,除非在它们自己的实现中。