如何理解 AKKA 中使用的这种 CCAS 锁定机制?
Posted
技术标签:
【中文标题】如何理解 AKKA 中使用的这种 CCAS 锁定机制?【英文标题】:How to understand this CCAS locking machanizion used in AKKA? 【发布时间】:2011-09-05 16:01:55 【问题描述】:我刚刚在 akka 中遇到了一段代码。
https://codereview.scala-lang.org/fisheye/browse/~raw,r=25521/scala-svn/scala/trunk/test/files/presentation/akka/src/akka/util/LockUtil.scala
下面列出了我感兴趣的核心方法。
/**
* 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?
【问题讨论】:
我认为你需要改进你的问题。你到底有什么不明白的? 我只需要一些关于它如何工作的基本概念。谢谢,先生:) 【参考方案1】:这是我对代码的理解。它使用获取的(AtomicBoolean)作为互斥锁。如果任何线程试图获取锁,那么它将设置为真。那么任何其他线程都无法获取锁,因为它们将从获取中获取真并返回假,直到该获取的此线程设置回假为止。
由于获取的不是集合,所以不会有ABA问题。所以它可以工作。
如果我错了,请纠正我。
【讨论】:
没有“直到线程完成”,如果你想阻塞,等待锁可用,你需要循环tryLock直到它成功(并且你有锁) 感谢您的正确。这只是由于我的措辞错误。 :-) 我会改正的。以上是关于如何理解 AKKA 中使用的这种 CCAS 锁定机制?的主要内容,如果未能解决你的问题,请参考以下文章