У меня есть следующий код:
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
}
}
Я не нашел хорошего руководства для использования synchronized
метода в Scala. Может ли кто-нибудь сообщить мне, если вышеуказанный код исправит мою проблему.
EDIT: Основываясь на комментариях ниже, я думаю, что AtomicLong
- лучшее решение для меня:
import java.util.concurrent.atomic.AtomicLong
private val ctr = new AtomicLong
def getCtr = ctr.incrementAndGet