コンパレータの単一のインスタンスを作成する場合、そのインスタンスを複数のスレッドで使用して、Collections.sort()を使用してコレクションを並べ替えることはできますか?または、スレッドセーフを確保するために、Collections.sort()を呼び出すたびにComparatorの新しいインスタンスを作成する必要がありますか?
8835 次
3 に答える
26
それはあなたがどのように実装するかに完全に依存しますComparator
。たとえば、インスタンス変数に書き込まれるか、比較中に内容が暗黙的に変更される場合、スレッドセーフではありません。
ほとんどのComparator
実装はそのようなことをしませんが、合理的に発生する可能性のある1つのシナリオは、SimpleDateFormat
日付を表す文字列を比較するためにを使用することです。残念ながら、SimpleDateFormat
それ自体はスレッドセーフではありません。
于 2010-05-21T18:04:34.117 に答える
5
コンパレータはインターフェイスであり、固有の同時実行プロパティはありません。実装がスレッドセーフであるかどうかは、どのように書くかによって決まります。それが行うすべてが比較メソッドのスコープに限定され(インスタンスまたはクラスレベルの状態がない)、使用するすべてのリソースがスレッドセーフである場合、それ自体がスレッドセーフになります。
于 2010-05-21T18:01:50.267 に答える
0
スレッドセーフではないコンパレータを見つけた場合、それらは通常(常に?)再入可能であるため、非常に驚きました。
並行性の問題は、ソートが行われている間にソートされているコレクションが変更されていた場合に発生します。
于 2010-05-21T18:04:11.043 に答える