Ich habe den folgenden Code:Wie synchron in Scala zu verwenden?
object Foo {
private var ctr = 0L
def bar = {
ctr = ctr + 1
// do something with ctr
}
}
Voraussetzung ist, dass ein ctr
Wert sollte nur einmal verwendet werden. In meinem Fall wird der gleiche Wert von ctr
wiederverwendet. Meine Theorie ist, dass dies passiert, weil Foo.bar
gleichzeitig in verschiedenen Threads aufgerufen wird (dies ist die einzige Schlussfolgerung, die ich zeichnen konnte). Ich habe den folgenden modifizierten Code als Update.
object Foo {
private var ctr = 0L
def getCtr = synchronized{
ctr = ctr + 1
ctr
}
def bar = {
val currCtr = getCtr
// do something with currCtr
}
}
konnte ich nicht eine gute Anleitung für die Verwendung der synchronized
Methode in Scala finden. Kann mir jemand mitteilen, ob der obige Code mein Problem beheben wird.
EDIT: Basierend auf den Kommentaren unten, ich glaube AtomicLong
die beste Lösung für mich ist:
import java.util.concurrent.atomic.AtomicLong
private val ctr = new AtomicLong
def getCtr = ctr.incrementAndGet
Haben Sie sich schon einmal https://twitter.github.io/scala_school/concurrency.html angesehen? Sie könnten auch eine AtomicLong verwenden. – Markon
Ich würde das Problem umgehen und einen 'AtomicInteger' verwenden. Diese sind für gleichzeitige Zähler vorgesehen. – Thilo
+1. Ich verstehe die Betonung auf höherer Gleichzeitigkeit (Futures, Schauspieler, etc.), aber es ist schade, dass definitive Scala-Bücher nicht einmal _mention_ 'obj.synchronized'-Syntax haben. –