22

コンパレータの単一のインスタンスを作成する場合、そのインスタンスを複数のスレッドで使用して、Collections.sort()を使用してコレクションを並べ替えることはできますか?または、スレッドセーフを確保するために、Collections.sort()を呼び出すたびにComparatorの新しいインスタンスを作成する必要がありますか?

4

3 に答える 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 に答える