我有以下代码设置 Atomic 变量(两者java.util.concurrent.atomic
的monix.execution.atomic
行为相同:
class Foo {
val s = AtomicAny(null: String)
def foo() = {
println("called")
/* Side Effects */
"foo"
}
def get(): String = {
s.compareAndSet(null, foo())
s.get
}
}
val f = new Foo
f.get //Foo.s set from null to foo, print called
f.get //Foo.s not updated, but still print called
第二次 compareAndSet 时,它没有更新值,但仍然调用了 foo。这导致了问题,因为foo
它有副作用(在我的真实代码中,它创建了一个 Akka 演员并给我错误,因为它试图创建重复的演员)。
除非实际使用,否则如何确保不评估第二个参数?(最好不要使用同步)
我需要将隐式参数传递给 foo 所以惰性 val 不起作用。例如
lazy val s = get() //Error cannot provide implicit parameter
def foo()(implicit context: Context) = {
println("called")
/* Side Effects */
"foo"
}
def get()(implicit context: Context): String = {
s.compareAndSet(null, foo())
s.get
}