8 コア 64G EC2 インスタンスで実行している Java アプリケーションを使用しています。そのメイン スレッドは、ハッシュマップに数十ギガバイトのデータをキャッシュします。キャッシュが完了すると、16 個のワーカー スレッドが生成されます (Thread のサブクラス)。ハッシュマップへの参照を受け取ります。ワーカー スレッドはキャッシュされたデータを読み取るだけで、変更することはありません。すべてのワーカー スレッドが同じキャッシュ データを参照することを期待しています。しかし、そうではありません。Hashmap のデータに穴があることがわかりました。一部のキーでは、ワーカー スレッドに値が表示されません。これは常に同じキーに対して発生します。ただし、ワーカー スレッドを 1 つだけ生成すると、すべて問題ありません。ここで何がうまくいかないのですか?
1 に答える
0
スレッド間で参照を渡すときに問題が発生する可能性があることがいくつかあります。チェックリストは次のとおりです。
- ワーカー スレッドが作成される前に、HashMap は完全に初期化されていますか?
- ハッシュマップが完全に書き込まれる前にスレッドが作成された場合、同期ブロックを使用してハッシュマップへの参照を渡していますか?
- または、ConcurrentHashMap を使用できますか? これは、複数のスレッドから安全に読み取り (および書き込み) できるように最適化されています。
- ワーカー スレッドが開始された後にハッシュマップを変更するには、同期されたブロックでハッシュマップを変更し、ワーカー スレッドが最初の同期と同じオブジェクトの同期されたブロックでマップを読み取ることを確認します (これは非効率的であり、より良い方法があります)。使用方法に基づいて、それを行う方法)。
スレッド セーフの完全な概要については、Java メモリ モデルまたは Java Concurrency In Practice の書籍を参照してください。
于 2013-10-28T19:02:42.133 に答える