/* Page prose (ja) */
"Reentrancy" = "# 再入（reentrancy）: 微妙な部分\n\nここが actor が人を驚かせるところです。actor は一度に 1 つのタスクを中に入れることを保証しますが、「一度に」には正確な意味があります。actor のメソッドが `await` に達して**中断する**たびに、待っている間は*actor の外に出ます*。actor はいま空くので、**別のタスクが入れます**。これを **再入（reentrancy）**と呼びます。actor はサスペンド（中断）の間に再入されうるのです。\n\nその帰結は鋭いものです。**`await` の前に読んだどんな値も、再開するころには変わっているかもしれません。** 状態はサスペンドをまたいで凍りついたままではありません。\n\n実際のバグを引き起こす様子を見てみましょう。この金庫は残高を確認し、取引の途中で非同期のステップを行い（承認サービスに問い合わせると想像してください）、それから差し引きます。";
"Reentrancy-2" = "**実行して確認:** 両方の窓口係が成功を報告し、最終残高は **`-60`** になります。それぞれの引き出しが、十分なお金があることを注意深く確認したにもかかわらず、口座は残高不足です。手順はこうです。\n\n1. 窓口係 A が入り、`100 >= 80` を確認し（通過）、それから `await` に達して**中断し**、actor を解放します。\n2. actor が空いているので、窓口係 B が入り、`100 >= 80` を確認し（これも通過。A はまだ差し引いていません！）、それから `await` に達して同じく中断します。\n3. 両方が目覚めて差し引きます。`100 - 80 = 20`、続いて `20 - 80 = -60`。\n\nguard は両方にとって真でした。*どちらかが中断している間*に残高は変わらなかったからです。しかし残高は*確認と差し引きの間*で変わりました。その隙間が `await` です。確認してから動く、は結局アトミックではなかったのです。\n\n* callout(試してみよう): sleep を `.seconds(2)` に変えても、残高超過は依然として起こります。長く待つことは解決策ではありません。`await` をまたぐ隙間を閉じることが解決策です。\n\n[前へ](@previous)  |  4 / 7 ページ  |  [次へ: 再入を防ぐ](@next)";
