回答:
最初のステップは、このタイプの問題を引き起こす可能性のあるものを試行し、特徴付けることです。これは、コードのセクションに正しい言語を選択することに関連しているため、次のことを考慮することから始めます。
さて、何がうまくいかない可能性を特定したら、今度は、何がうまくいかなかったかを調べるために必要なデータがあることを確認します。
最後に、問題の再現方法と原因を把握できるまで問題を絞り込んだら、コードで問題を強制できる最小の自動テストを作成します。問題を1つのクラスに絞り込んだ場合、またはクラスのペアが正しく機能しない場合は、そのレベルで再現します。100個のスレッドを生成する必要はありません。問題を100%発生させることができる最小のテストを実行するだけです。
今、あなたはそれを修正することができ、それが再びあなたを噛むために戻ってこないことを合理的に確信することができます。
バグは非生産的ではありません。あなたはまだそれを再現する方法を見つけていません。
Random()ステートメントの戻り値に基づいて例外をスローしない限り、バグはランダムではありません。
これはセマンティクスのように見えるかもしれませんが、自分にこれを伝えることは精神的に安心です。
複雑な競合状態などが原因でのみ発生するバグを再現する方法を見つけることは、非常に困難でイライラします。
それを見つける方法については、より多くの情報を提供できる場所でアプリケーションのロギングをオン/追加します。
次に、バグを見ている人(開発者、QA、エンドユーザー)に、バグが発生した時点ですぐに報告するよう伝え、ログを調べます。他の情報を求めてください。バグはいくつかの異なるシステムの相互作用または競合状態が原因でのみ発生する可能性があります。
うまくいけば、リードを見つけることができるでしょう。
再現が同じ手順で失敗することがある場合は、自動化が役立ち、それを自動化してループに入れる必要があります。50,000回実行すると、発生する可能性が非常に高くなります。
この問題を明示する条件を特定するためのパターンを見つけてください。これは、失敗する(または一貫性のない動作をする)コードのセクションに向けられるはずです。