java - 如何理解AKKA中使用的这种CCAS锁定机制?

标签 java scala locking akka compare-and-swap

我刚刚在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?

最佳答案

这是我对代码的理解。它使用获取的(AtomicBoolean)作为互斥体。如果任何线程尝试获取锁,那么它将把 acquire 设置为 true 。那么任何其他线程都无法获取锁,因为它们将从获取的锁中获取 true 并返回 false,直到该线程将获取的锁设置回 false。

由于获取不是来自集合,因此不会出现 ABA 问题。所以它可以工作。

如有错误,请指正。

关于java - 如何理解AKKA中使用的这种CCAS锁定机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310377/

相关文章:

java - Thymeleaf 模板结果缓存

java - Swing 计时器仅在最后一个事件上运行

scala - "r0"、 "r1"等在 Scala 中有特殊含义吗?

scala - Scala 中 Catamorphisms 的高效实现

Java - 并发清除列表

unix - 如何让人类和程序在不踩到对方脚趾的情况下访问同一个文件

java - 如何同步缓存列表访问

java - 如何在Java中使用不同的用户ID将多行插入MySQL?

java - 如何设置转换为字母的符号列表?

scala - Akka - 您应该创建多少个 Actor 实例?