gpt4 book ai didi

scala - 如何在Scala中使用同步?

转载 作者:行者123 更新时间:2023-12-03 11:51:37 25 4
gpt4 key购买 nike

我有以下代码:

object Foo {
private var ctr = 0L

def bar = {
ctr = ctr + 1
// do something with ctr
}
}

要求是 ctr值只能使用一次。在我的情况下, ctr的相同值被重用。我的理论是,发生这种情况是因为在不同线程中同时调用了 Foo.bar(这是我唯一能得出的结论)。我有以下修改后的代码作为修复。
object Foo {
private var ctr = 0L
def getCtr = synchronized{
ctr = ctr + 1
ctr
}
def bar = {
val currCtr = getCtr
// do something with currCtr
}
}

我找不到在Scala中使用 synchronized方法的好指南。任何人都可以让我知道上面的代码是否可以解决我的问题。

编辑:根据以下评论,我认为 AtomicLong对我来说是最好的解决方案:
import java.util.concurrent.atomic.AtomicLong
private val ctr = new AtomicLong
def getCtr = ctr.incrementAndGet

最佳答案

如果您不想要AtomicInteger,那么以下是使用synchronized的方法

object Foo {
private var ctr = 0L
def getCtr = this.synchronized {
ctr = ctr + 1
ctr
}
def bar = {
val currCtr = getCtr
// do something with currCtr
}
}

您需要在某些对象上进行同步。在这种情况下,当前对象是 this

简而言之:Scala的格式为(该块可以返回值)
this.synchronized {
ctr = ctr + 1
ctr
}

它等效于Java的
synchronized(this) {
return ++ctr;
}

Scala没有像Java一样的 synchronized方法,只是块。

编辑

要回答以下评论中的问题: synchronized可以用作 AnyRef类中的方法:

https://www.scala-lang.org/api/current/scala/AnyRef.html
final def synchronized[T0](arg0: ⇒ T0): T0

因此,您正在调用对象的方法,就像执行 toStringthis.toString一样。

关于scala - 如何在Scala中使用同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34877487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com