如何理解 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 锁定机制?的主要内容,如果未能解决你的问题,请参考以下文章

Akka 是不是淘汰了 Camel?

Akka中使用Logback日志框架

如何让 Shiro 在 Scala + Akka + Spray 环境中工作

Akka 有限状态机实例

如何破解教师机对学生机的键盘锁定 黑屏

在池中跨 Akka Actor 实例共享可变数据