Skip to content

Commit fe25652

Browse files
committed
fix possibility deadlock in sendAll method
1 parent 94cf9bb commit fe25652

File tree

1 file changed

+19
-5
lines changed
  • src/main/scala/org/learningconcurrency/exercises/ch2

1 file changed

+19
-5
lines changed

src/main/scala/org/learningconcurrency/exercises/ch2/ex7.scala

+19-5
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,26 @@ object Ex7 extends App {
3333
}
3434
}
3535

36-
def sendAll(accounts: Set[Account], target: Account):Unit = {
37-
accounts.map((a) => thread {
38-
send(a,target,a.money)
39-
} ).foreach(_.join)
4036

37+
def sendAll(accounts: Set[Account], target: Account): Unit = {
38+
39+
def adjust() = {
40+
target.money = accounts.foldLeft(0)((s, a) => {
41+
val money = a.money
42+
a.money = 0
43+
s + money
44+
}
45+
)
46+
}
47+
48+
def sendAllWithSynchronize(la: List[Account]): Unit = la match {
49+
case h :: t => h synchronized {
50+
sendAllWithSynchronize(t)
51+
}
52+
case _ => adjust()
53+
}
54+
55+
sendAllWithSynchronize((target :: accounts.toList).sortBy(_.uid))
4156
}
4257

4358
val accounts = (1 to 100).map((i) => new Account(s"Account: $i",i*10)).toSet
@@ -48,5 +63,4 @@ object Ex7 extends App {
4863
accounts.foreach((a) => log(s"${a.name}, money = ${a.money}"))
4964
log(s"${target.name} - money = ${target.money}")
5065

51-
5266
}

0 commit comments

Comments
 (0)