gpt4 book ai didi

multithreading - Clojure 的 Atom 的 Scala 等价物是什么?

转载 作者:行者123 更新时间:2023-12-04 02:02:13 25 4
gpt4 key购买 nike

Clojure has an Atomchanging state between threads in a synchronous and independent manner , that is not part of the STM .您use it like this :

user=> (def my-atom (atom 0))
#'user/my-atom

user=> @my-atom
0

user=> (swap! my-atom inc)
1

user=> @my-atom
1

user=> (swap! my-atom (fn [n] (* (+ n n) 2)))
4

我的问题是: Clojure 的 Atom 的 Scala 等价物是什么?

最佳答案

正如@Shepmaster 和@om-nom-nom 所说,它是 java.util.concurrent.atomic.Atomic... 的包装器.

等效的包装器可能如下所示:

import java.util.concurrent.atomic._
import scala.annotation.tailrec

object Atom {
def apply[A](init: A): Atom[A] = new Impl(new AtomicReference(init))

private class Impl[A](state: AtomicReference[A]) extends Atom[A] {
def apply(): A = state.get()
def update(value: A): Unit = state.set(value)
def transformAndGet(f: A => A): A = transformImpl(f)

@tailrec private final def transformImpl(fun: A => A): A = {
val v = state.get()
val newv = fun(v)
if (state.compareAndSet(v, newv)) newv
else transformImpl(fun)
}
}
}
trait Atom[A] {
def apply(): A
def update(value: A): Unit
def transformAndGet(f: A => A): A
}

前任:
val myAtom = Atom(0)
myAtom() // --> 0
myAtom.transformAndGet(_ + 1) // --> 1
myAtom() // --> 1
myAtom.transformAndGet(_ * 4) // --> 4

如果您使用 Scala-STM ,通过使用 .single,该功能已内置到 STM 引用中。看法:
scala> import scala.concurrent.stm._
import scala.concurrent.stm._

scala> val myAtom = Ref(0).single
myAtom: scala.concurrent.stm.Ref.View[Int] =
scala.concurrent.stm.ccstm.CCSTMRefs$IntRef@52f463b0

scala> myAtom()
res0: Int = 0

scala> myAtom.transformAndGet(_ + 1)
res1: Int = 1

scala> myAtom()
res2: Int = 1

scala> myAtom.transformAndGet(_ * 4)
res3: Int = 4

优点是 Ref.apply已经为您提供了原始类型的专门单元,例如 Int而不是 AnyRef (盒装)。

关于multithreading - Clojure 的 Atom 的 Scala 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21806074/

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