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()
}
}