Как использовать синхронизированный в Scala?

У меня есть следующий код:

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 метод в Скала. Может кто-нибудь, дайте мне знать, если вышеуказанный код решит мою проблему.

РЕДАКТИРОВАТЬ: Основываясь на комментариях ниже, я думаю,AtomicLong это лучшее решение для меня:

import java.util.concurrent.atomic.AtomicLong
private val ctr = new AtomicLong
def getCtr = ctr.incrementAndGet

Ответы на вопрос(1)

Ваш ответ на вопрос