2

多数のスレッド間で共有される文字列のリストがあります。各スレッドは次のことを行う必要があります。

  1. リストにアクセスします (たとえば、getter メソッドを介して)。
  2. リストのサイズを取得します。
  3. ゼロから list.size() までの乱数 n を選択します。
  4. リストからオフセット n の要素を抽出します。
  5. 抽出された要素をリストから削除します。
  6. リストを「保存」して、他のスレッドが常に更新されたリストを表示できるようにします

変更可能な共有オブジェクト (リスト) への同時アクセスがあるため、スレッドセーフな方法でコーディングする必要があります。各スレッドはリスト サイズを 1 ずつ減らす必要があるため、他のすべてのスレッド アクセスはより短いリストを参照する必要があります。私の目的は、同じ要素が 2 回抽出される可能性があるため、スレッドが別のスレッドから見た同じリストを見ることができないようにすることです。

これを達成するための最良の方法はどれですか? CopyOnWriteArrayList について考えていましたが、必要なように動作するかどうかわかりません。

ありがとうございました

4

2 に答える 2

7

問題は、操作 1 ~ 6 がアトミックである必要があり、CopyOnWriteArrayList を使用してもそれが解決されないことです。

1 つの解決策は、操作全体を単純に同期することです。

private final List<String> list = new ArrayList<String> ();
public String getNextItem() {
    synchronized(list) {
        //get the string adn remove it from the list
    }
    return next;
}

または、アルゴリズムを見直して、次のようにすることもできます。

于 2013-01-08T07:09:01.887 に答える
0

上記の一連のロジックを同期ブロックに配置できない理由、または上記の一連のロジック中にリストへの排他的アクセスにセマフォ/ミューテックスを使用できない理由はわかりません。

于 2013-01-08T07:09:10.243 に答える