- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Collection.sort() の同期についての確認事項)
Collection.sort()の同期についての確認事項
このQ&Aのポイント
- Collection.sort()の呼び出しによるソート処理の完了を保証する方法はあるか?
- ArrayListにアクセスする際に、ソート中のデータにアクセスしてしまう可能性はあるか?
- Collection.sort()が完全に終了するまで待機する方法はあるか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、Collection.sortではなく、Collections.sortですよね? 次に、質問の意味は、 「Collections.sortから復帰したときには、ソートが完了しているか」 ということでしょうか? それとも、「Collections.sortを実行したのとは別のスレッドでソート対象のListオブジェクト にアクセスした場合」の話でしょうか? 前者の場合は、全く問題ありません。 後者の場合は、問題が発生する場合があります。 問題が発生しないためには、 1.Listオブジェクトのアクセス用メソッド(get、set等)が同期メソッドである。 2.Collections.sortが、ソート開始から終了までListオブジェクトをロックしている。 ことが必要です。
その他の回答 (1)
- ngsvx
- ベストアンサー率49% (157/315)
回答No.2
>ということで良かったでしょうか? その通りです。 >あと、上記のようにsetやgetが同期メソッドに >なっている標準的なデータクラスって >なにかないでしょうか? A.java.util.Collections#synchronizedListで取得したListインターフェースを使う B.java.util.Vectorクラスを使う が同期に対応しているようです。 *Vectorクラスは、JAVA1.2あたりからListインターフェースを実装しています。
質問者
お礼
ソート機能がついた一覧画面が複数あって それらが継承すべき抽象レベルクラス群を 作成していました。 ありがとうございます。 大変参考になりました。
お礼
Collection.sort( ではなく Collections.sort( です。 >前者の場合は、全く問題ありません。 ↑ありがとうございます おかげで、安心できました。 Collections.sort( を呼び出したスレッドと、 ソートされた後のデータを使用する スレッドは同一スレッドです。 今回の質問は前者の場合であったので。 一応これで、疑問は解決できたのですが。 後者についてですが・・・・ >1.Listオブジェクトのアクセス用メソッド(get、set等)が同期メソッドである。 >2.Collections.sortが、ソート開始から終了までListオブジェクトをロックしている。 ことが必要です。 ↑についてですが。 例えば、ArrayListを継承して getやsetメソッドを以下のように オーバーライドして、 public synchronized Object get(int index) { return super.get(index); } public synchronized void get(Object o) { super.set(o); } ソートするロジックについてですが、 たとえば、 valuesという 上記のArrayList継承クラスの オブジェクトがあったとして。 ソートをする側のスレッドでは synchronized(values) { Collections.sort(values); } とすると、 アクセスする側は、getやsetを発行した時に ソートが完了するまでまたされる。 ということで良かったでしょうか? あと、上記のようにsetやgetが同期メソッドに なっている標準的なデータクラスって なにかないでしょうか?