/* Page prose (ja) */
"HardToCatch" = "# なぜこれほど見つけにくいのか\n\nこの破損は*タイミング*に依存します。どの窓口係がたまたま別の窓口係の隙間の間に読み取るか、ということです。タイミングは CPU の負荷、コア数、デバイスが他に何をしているか、そして単なる運によって変わります。それが **非決定的** の意味です。同じコード、同じ入力でも、結果が異なるのです。ですから、このバグは次のとおりです。\n\n* **再現しないかもしれません。** テストに通ったのは、テストが運に恵まれたからです。\n* **デバッガの下で消えるかもしれません。** デバッガはタイミングを変えるからです。\n* **本番環境でしか牙をむかないかもしれません。** あなたのものより忙しい、あるいは遅いデバイスで。\n\n見つけるために実行に頼ることはできません。見つけるにはそれを*読む*のです。重要なのは、ただ一つの問いです。\n\n**並行タスクの間で共有され、変更される状態が、アクセスを協調するものが何もないまま存在していないか？**\n\nこの例では、`account.balance` は共有されており（一つの `Account` が、すべてのクロージャにキャプチャされています）、変更され（`account.balance = updated`）、そして並行な `tellers` キューを協調するものは何もありません。三つのうち三つ。これは data race であり、紙の上で証明でき、テストを実行する必要はありません。\n\n* callout(補足): 完全な Xcode プロジェクトには、実行時に data race を指摘する **Thread Sanitizer** というツールがあります。これは Xcode 専用で、Swift Playground では使えません。ですからこの本を通して、競合を手作業で推論する方法を学びます。それはいずれにせよ、より長持ちするスキルです。\n\n[前へ](@previous)  |  3 / 9 ページ  |  [次へ: シリアルキューによる解決策](@next)";
