@xtccc
2016-12-30T22:06:39.000000Z
字数 1155
阅读 1749
Scala
参考:
+ Thread Safety Problem
+ Concurrency in Scala
目录
object TestSynchronize extends App {
val factory = new Factory()
val f: IndexedSeq[Future[Unit]] =
for (i <- 0 until 10) yield Future {
factory.m1(i)
}
val sequence: Future[IndexedSeq[Unit]] = Future.sequence(f)
Await.result(sequence, 30 seconds)
println("全部结束")
}
class Factory {
def m1(x: Int): Unit = {
println(s"进入: $x")
Thread.sleep(Math.abs(Random.nextInt()) % 2 * 1000)
println(s"离开: $x\n")
}
}
运行结果:
进入: 2
进入: 3
进入: 4
进入: 1
进入: 6
进入: 7
进入: 0
进入: 5
离开: 1进入: 8
离开: 8进入: 9
离开: 2离开: 3
离开: 5
离开: 4
离开: 7
离开: 9
离开: 6
离开: 0
全部结束
可以,以上是并发运行的,所以打印出的内容是乱序的。
可以通过 synchronized
关键字实现互斥访问
object TestSynchronize extends App {
val factory = new Factory()
val f: IndexedSeq[Future[Unit]] =
for (i <- 0 until 10) yield Future {
factory.m1(i)
}
val sequence: Future[IndexedSeq[Unit]] = Future.sequence(f)
Await.result(sequence, 30 seconds)
println("全部结束")
}
/**
* 要求, 方法Factory.produce不能同时被多个线程访问
* 换句话说,它必须是thread-safety method
* */
class Factory {
def m1(x: Int): Unit = this.synchronized {
println(s"进入: $x")
Thread.sleep(Math.abs(Random.nextInt()) % 2 * 1000)
println(s"离开: $x\n")
}
}
运行结果:
进入: 0
离开: 0进入: 7
离开: 7进入: 9
离开: 9进入: 6
离开: 6进入: 5
离开: 5进入: 4
离开: 4进入: 3
离开: 3进入: 1
离开: 1进入: 2
离开: 2进入: 8
离开: 8全部结束