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

     2023-02-16     240

关键词:

【中文标题】如何理解 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直到它成功(并且你有锁) 感谢您的正确。这只是由于我的措辞错误。 :-) 我会改正的。

使用云祺虚拟机备份软件备份h3ccas虚拟机(代码片段)

1、进入云祺虚拟机备份系统,选择【备份/恢复】——【虚拟机备份】,新建备份任务。2、在H3CCAS虚拟化类型下勾选要备份的虚拟机,选择的虚拟机即显示在【已选择的虚拟机】下面,滚动页面到底部,点击【下一步】。3、备... 查看详情

使用云祺虚拟机备份软件恢复h3ccas虚拟机

1、进入云祺虚拟机备份系统,选择【备份/恢复】—【虚拟机恢复】,新建恢复任务。2、在H3CCASr虚拟化类型下勾选要需要恢复的备份点,点击【下一步】。3、设置恢复目标宿主机,并按需配置恢复虚拟机的名称、状态、存储、... 查看详情

akka中使用logback日志框架

...品环境,当然你可以整合SLF4J这样的日志系统,下面介绍如何在Akka中使用Logback记录日志。 1.创建Maven工程引入相关依赖。<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSche 查看详情

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

】如何让Shiro在Scala+Akka+Spray环境中工作【英文标题】:HowcanimakeShiroworkinScala+Akka+Sprayenvironment【发布时间】:2013-07-2209:25:57【问题描述】:我想我没有正确理解工作流程。我正在使用ApacheShiro和Stormpath在Scala中编写Web服务。我的用... 查看详情

如何自动扩展分片 Akka 集群?

】如何自动扩展分片Akka集群?【英文标题】:HowtoscaleshardedAkkaClusterautomatically?【发布时间】:2020-12-0908:56:58【问题描述】:Akka集群文档没有指定我们如何自动扩展集群-添加或删除节点。这应该如何在Akka生态系统中实现?例如... 查看详情

从谷歌云中的虚拟机锁定

...,我们无法通过浏览器连接到它。这里可以做什么?我们如何才能重新获得对我们机器的访问权限?VM是UbuntuServer16.04。【问题讨论】:仔细检查 查看详情

Akka 是不是淘汰了 Camel?

...【发布时间】:2015-03-2009:15:45【问题描述】:我对Akka的理解是它提供了一个模型,多个独立的线程可以通过这种模型以高度并发的方式相互通信。它使用“演员模型”,其中每个线程都是有特定工作要做的“演员”。您可以协... 查看详情

談談理解中的驅動

 驱动,熟悉又陌生的名词,熟悉是因为我们都遇到过,外设接入电脑的时候,都被要求安装驱动,否则无法使用。为什么像键盘这种设备不用安装驱动?因为在系统早就自带了键盘这种外设的驱动。所以,当系统没有我们的... 查看详情

如何使用 akka 连接到 Unix 套接字?

】如何使用akka连接到Unix套接字?【英文标题】:HowcanoneconnecttoaUnixsocketusingakka?【发布时间】:2014-11-0608:12:03【问题描述】:虽然在akka中使用TCP或UDP连接到java.net.InetSocketAddress相对容易,但API中似乎没有SocketAddress和Unix-sockets的等... 查看详情

如何在akka中扩展超级演员的行为

】如何在akka中扩展超级演员的行为【英文标题】:Howextendbehaviourofsuperactorinakka【发布时间】:2017-09-2907:29:28【问题描述】:我想使用akkaactor实现CRUD操作。我是akka新手,所以不知道akkaactor的设计基础。我想在多个子actor中分享akka... 查看详情

如何在休眠中进行乐观锁定

】如何在休眠中进行乐观锁定【英文标题】:Howtodooptimisticlockinginhibernate【发布时间】:2011-10-1801:14:46【问题描述】:我对Hibernate和Spring完全陌生,并且在尝试学习Spring、Hibernate、Maven等时,我只知道如何使用这三者运行一个hello... 查看详情

如何使用stampedlock乐观锁定?(我无法理解来自javadoc的代码示例)

最近我了解了StampedLock的存在?qazxsw指出我意识到它是改进的ReentrantReadWriteLock有一些差异:不是可重入的支持乐观锁定支持从readLock升级到writeLock我也从java中读过例子,但我不明白那段代码:https://docs.oracle.com/javase/10/docs/api/java/... 查看详情

如何在akka中禁用“收到八卦状态”登录?

】如何在akka中禁用“收到八卦状态”登录?【英文标题】:Howtodisable"Receivedgossipstatus"loginakka?【发布时间】:2017-05-2415:16:22【问题描述】:我在运行时使用akka集群我收到这样的日志Receivedgossipstatusfrom[akka.tcp://test@ip:port],ch... 查看详情

如何在 Akka Http 中使用 HttpResponse

】如何在AkkaHttp中使用HttpResponse【英文标题】:HowtoconsumeHttpResponseinAkkaHttp【发布时间】:2022-01-1519:02:00【问题描述】:importakka.actor.ActorSystemimportakka.http.scaladsl.Httpimportakka.http.scaladsl.model.HttpMethods,HttpRequest,Uriimpor 查看详情

乐观锁定:使用其他资源修改资源(代码片段)

...ag(RFC7232)方法来实施并发访问规则吗?如果没有,我们如何修改API结构或使用其他方法来实现它?我的问题是如何使用来自多个资源的ETag来强制执行RFC。我理解在这种特殊情况下我们可以使用POST逐个添加产品等。但在现实生... 查看详情

Akka 的 I/O 是如何工作的?

】Akka的I/O是如何工作的?【英文标题】:HowdoesI/OworkinAkka?【发布时间】:2011-09-2514:33:01【问题描述】:当您需要执行I/O(即数据库操作)时,actor模型(在Akka中)如何工作?据我了解,阻塞操作会引发异常(并且由于Akka使用的N... 查看详情

Akka 有限状态机实例

】Akka有限状态机实例【英文标题】:Akkafinitestatemachineinstances【发布时间】:2018-11-1320:16:30【问题描述】:我正在尝试将Akka的有限状态机框架用于我的用例。我正在开发一个系统来处理经过各种状态的请求。这里的请求是需要连... 查看详情

如何在 Akka Actor 中使用 MYSQL jdbc 实现

】如何在AkkaActor中使用MYSQLjdbc实现【英文标题】:HowtoimplementusingMYSQLjdbcinanAkkaActor【发布时间】:2016-04-0718:47:39【问题描述】:嘿,我读了这个jdbc文档https://www.playframework.com/documentation/2.1.0/ScalaDatabase这个问题Isitgoodtoputjdbcoperations... 查看详情