scala/ScalaBook/chapter-07/syncCell.scala

class cell (protected var contents : Int){
  private var ReadyToRead = true
  private var ReadyToWrite = false
  var lock  = new AnyRef
  def get() : Int = 
    lock.synchronized {
      while ( !ReadyToRead ) lock.wait
      ReadyToRead  = false
      ReadyToWrite = true
      lock.notifyAll
      contents
    }
  def set(n: Int) : Unit = 
    lock.synchronized {
      while ( !ReadyToWrite ) lock.wait
      ReadyToWrite = false
      ReadyToRead = true
      contents = n
      lock.notifyAll
    }
} 

class doubleCell(c : cell) extends Runnable {
   override def run(): Unit = {
     for ( i <- 1 to 10) {
       var v = c.get
       println("D---> got "+v)
       c.set(2*v)
       println("D---> send "+(2*v))
     }
     return
   } 
}

class halveCell(c : cell) extends Runnable {
   override def run(): Unit = {
     var v = c.get
     for ( i <- 1 to 10) {
       c.set(v/2)
       println("H---> send "+(v/2))
       v = c.get
       println("H---> got "+v)
     }
     return
   } 
}

object threadExample3 {
  def main(args: Array[String]) { 
    var c = new cell(16)
    new Thread(new doubleCell(c)).start()
    new Thread(new halveCell(c)).start()
  }
}