teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/07/13 05:33

投稿

root_jp
root_jp

スコア4666

answer CHANGED
@@ -1,3 +1,23 @@
1
1
  `transferMoney`メソッドの中で最初の`synchronized`ブロックで自分を掴みます。
2
2
  次の`synchronized`ブロックで、お互いを掴もうとしてますが、もう掴み済みなのでお互いが開放されるのを待っています。
3
- いわゆるデッドロックですね。
3
+ いわゆるデッドロックですね。
4
+
5
+ ### コメントに対する追記
6
+
7
+ 自分から金額を引き落として、相手に振り込むまでを1トランザクションとしたいため、
8
+ 以下のようにすればいいと思います。
9
+
10
+ ```Java
11
+ public void transferMoney(MyBank other, int amount) throws InterruptedException {
12
+ synchronized (MyBank.class) {
13
+ System.out.println("Transferring " + amount + " from " + name);
14
+ Thread.sleep(100);
15
+ if (amount > value)
16
+ System.out.println("Not enough money");
17
+ else {
18
+ other.value = other.value + amount;
19
+ this.value -= amount;
20
+ }
21
+ }
22
+ }
23
+ ```