Mam następujący kod:Jak używać synchronizacji w Scali?
object Foo {
private var ctr = 0L
def bar = {
ctr = ctr + 1
// do something with ctr
}
}
wymóg jest, że wartość ctr
powinny być używane tylko raz. W moim przypadku ta sama wartość ctr
jest ponownie wykorzystywana. Moja teoria mówi, że dzieje się tak dlatego, że Foo.bar
jest wywoływany jednocześnie w różnych wątkach (jest to jedyny wniosek, który mogłem wyciągnąć). Mam następujący zmodyfikowany kod jako poprawkę.
object Foo {
private var ctr = 0L
def getCtr = synchronized{
ctr = ctr + 1
ctr
}
def bar = {
val currCtr = getCtr
// do something with currCtr
}
}
nie mogłem znaleźć dobrego przewodnika metodą w Scala synchronized
. Czy ktoś może dać mi znać, jeśli powyższy kod naprawi mój problem.
EDIT: Na podstawie poniższych uwag, myślę AtomicLong
jest najlepszym rozwiązaniem dla mnie:
import java.util.concurrent.atomic.AtomicLong
private val ctr = new AtomicLong
def getCtr = ctr.incrementAndGet
Czy obejrzałeś już to https://twitter.github.io/scala_school/concurrency.html? Możesz także użyć AtomicLong. – Markon
Zrobiłem krok po kroku i użyłem 'AtomicInteger'. Te są wykonane dla współbieżnych liczników. – Thilo
+1. Rozumiem nacisk kładziony na współbieżność wyższego poziomu (futures, aktorzy, itp.), Ale jest to szkoda, że książki Scala nie zawierają nawet składni _mention_ 'obj.synchronized'. –