我刚刚在akka中发现了一段代码。
下面列出了我感兴趣的核心方法。
/**
* A very simple lock that uses CCAS (Compare Compare-And-Swap)
* Does not keep track of the owner and isn't Reentrant, so don't nest and try to stick to the if*-methods
*/
class SimpleLock {
val acquired = new AtomicBoolean(false)
def ifPossible(perform: () => Unit): Boolean = {
if (tryLock()) {
try {
perform
} finally {
unlock()
}
true
} else false
}
def tryLock() = {
if (acquired.get) false
else acquired.compareAndSet(false, true)
}
def tryUnlock() = {
acquired.compareAndSet(true, false)
}
有两个相关的子问题。
1)这个类SimpleLock的用途是什么
2)有关其工作原理的任何提示或背景知识吗?
我认为由于此代码是用 JAVA 和 scala 编写的,因此它利用了 AtomicBoolean 类。 所以我也会添加 java 标签。
欢迎任何建议!不知道为什么有人投票结束这个问题。
相关:
Can anyone interpret this C++ code (from OpenJDK6) into plain English?
最佳答案
这是我对代码的理解。它使用获取的(AtomicBoolean)作为互斥体。如果任何线程尝试获取锁,那么它将把 acquire 设置为 true 。那么任何其他线程都无法获取锁,因为它们将从获取的锁中获取 true 并返回 false,直到该线程将获取的锁设置回 false。
由于获取不是来自集合,因此不会出现 ABA 问题。所以它可以工作。
如有错误,请指正。
关于java - 如何理解AKKA中使用的这种CCAS锁定机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310377/