How to use synchronized in Scala?

If you don’t want an AtomicInteger, here is how to use synchronized

object Foo {
 private var ctr = 0L
 def getCtr = this.synchronized {
   ctr = ctr + 1
   ctr
 }
 def bar = {
    val currCtr = getCtr
    // do something with currCtr
  }
}

You need to synchronize on some object. In this case on your current object which is this.

In short: Scala’s format is (and the block can return a value)

this.synchronized {
   ctr = ctr + 1
   ctr
}

It is equivalent of java’s

synchronized(this) {
   return ++ctr;   
}

Scala does not have synchronized methods as java, just blocks.

Edit

To answer the question from comment below: synchronized can be used as a method from class AnyRef:

https://www.scala-lang.org/api/current/scala/AnyRef.html

final def synchronized[T0](arg0: ⇒ T0): T0

so you are calling a method of your object, just like you would do toString and this.toString.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)