web-dev-qa-db-ja.com

Java JDKに並行リストはありますか?

インデックスで要素にアクセスできる並行Listインスタンスを作成する方法を教えてください。 JDKに使用できるクラスやファクトリメソッドはありますか?

230

Java.util.concurrent に並行リストの実装があります。 特にCopyOnWriteArrayList

149
user177800

インデックスベースのアクセスを気にせず、単にListの挿入順を保持する特性が必要な場合は、 Java.util.concurrent.ConcurrentLinkedQueue これはIterableを実装しているので、すべての項目を追加し終えたら、拡張for構文を使用してコンテンツをループ処理できます。

Queue<String> globalQueue = new ConcurrentLinkedQueue<String>();

//Multiple threads can safely call globalQueue.add()...

for (String href : globalQueue) {
    //do something with href
}
134
Matt Passell

必要なのが単純な呼び出し同期だけである場合は、 Collections.synchronizedList(List) を使用することができます。

 List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());
116
Yanick Rochon

位置を取得し、与えられた位置から要素を取得するという行為は、当然のことながら何らかのロックを必要とします(これら2つの操作の間でリストに構造的な変更を加えることはできません)。

コンカレント・コレクションの目的は、各操作がそれ自体でアトミックであり、明示的なロックや同期を行わなくても実行できることです。

したがって、指定されたnからListの位置にある要素をアトミック操作として取得することは、同時アクセスが予想される状況ではあまり意味がありません。

41
Joachim Sauer