問題タブ [copyonwritearraylist]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
669 参照

java - 内部コレクション アイテムを公開する場合、Iterator または Iterable を使用する必要がありますか?

データのプライベートな可変リストを持つクラスがあります。

次の条件を指定して、リスト項目を公開する必要があります。

  • リストは外部で変更可能であってはなりません。
  • getter 関数を使用する開発者にとって、取得したリストを変更できないことは明らかです。

どのゲッター関数を推奨アプローチとしてマークする必要がありますか? または、より良い解決策を提供できますか?

UPD: この質問は、リスト ゲッター実装のベスト プラクティスに関する実際のコード レビュー ディスカッションからのものです。

0 投票する
2 に答える
1123 参照

java - ActiveMQ DestinationSource.getQueues 応答からキューを適切に反復する

何らかの理由で、次のコードでは単純な ではなくdestinationSource.getQueues()が返されます。for ループはがいっぱいになる前に処理を開始し、その性質上ループ前の項目のみを処理するため、これは問題です。そこに を投入できることはわかっていますが、根本的な問題は解決しません。ではなくとして返される理由はありますか? また、反復中に追加されたものであっても、すべてのアイテムが確実にカバーされるようにする方法はありますか?CopyOnWriteArraySetSetSetCopyOnWriteArraySetSetThread.sleep()CopyOnWriteArraySetSetCopyOnWriteArraySet

編集:ここに私が思いついた解決策がありますが、完全ではありませんが、キューが追加されるまでに1秒以上かかるまで、すべてのキューを確実に取得できます。

0 投票する
1 に答える
112 参照

java - CopyOnWriteArrayList - スタックはどのように更新されますか?

の場合CopyOnWriteArrayList、要素がコレクションに追加されるたびに新しいオブジェクトが作成されます。

以下の例を検討してください。

要素が追加されるたびに、新しいオブジェクトが作成さplayersUsing2れ、スタック上の参照が更新されて、そのメモリ位置がポイントされます。理解できる。

ここで、別のメソッドに渡すplayersUsing2ので、新しいスタック フレームが作成され、playersUsingNew同じメモリ位置を指します。そして、新しい要素が追加されると、新しいオブジェクトが作成され、playersUsingNew新しいメモリ位置を指します。

しかし、どのようにして最初のスタック フレームplayersUsing2が更新され、最新のメモリ位置を指すのでしょうか?

実装を見ましjava.util.concurrent.CopyOnWriteArrayList.add(E)たが理解できませんでした。処理するのはネイティブ コードと JVM によるものですか。

出力:

0 投票する
1 に答える
1322 参照

java - CopyOnWriteArrayList が遅すぎる

私は次のケースを持っています、

出力

これは、約 100 秒かかったのに比べて、かなりゆっくりと要素を追加します。ドキュメントで理由を知りましたが、ArrayList0.004690843

ArrayList基になる配列の新しいコピーを作成することによって、すべての変更操作 (追加、設定など) が実装されるのスレッドセーフなバリアント。

したがって、私の理解では、このリストに新しい要素を追加するたびに、新しい新しい配列が作成され、この配列の最後のインデックスに要素が追加されます。ロックインaddメソッドを見つけましたが、それとは別に、そのメソッドは実際に毎回新しい配列を作成しています。

私が自分のプログラムを増やしMAX_NUMBERたとき10_00_000、プログラムは実行され続け、決して終了しません(そうなるでしょうが、私はそれほど長く待つことはできません)。

Collections.synchronizedList速度でスレッドセーフが必要な場合は、より良い選択だと思います。私はそれを使用し、それは約かかりました0.007673728

私の質問:

  1. 内部的に新しい配列を作成するのはなぜスレッドセーフがこれに関連しているのでしょうか?
  2. の場合、なぜそんなに時間がかかったのMAX_NUMBER = 10_00_000ですか?( で約6秒かかったようにMAX_NUMBER = 10_00_00)これは、ミュータティブ操作が毎回新しい配列を作成するために発生していますか?
  3. CopyOnWriteArrayListこれは、膨大な数の要素があり、他のものを選択した方がよい場合にパフォーマンスが低下することを意味しますか (つまりCollections.synchronizedList)?
  4. CopyOnWriteArrayListこれが、パブリック API で通常見られない理由ですか? これ以外に欠点はありますか?
0 投票する
2 に答える
305 参照

java - Javaで現在のコンテンツを上書きせずに外部テキストファイルに書き込むにはどうすればよいですか

見逃した応答を外部テキスト ファイルに書き込もうとしています。以下のメソッドは、認識されなかった応答を外部テキスト ファイルに保存しますが、以前のコンテンツを上書きします。上書きしないようにするにはどうすればよいですか?

//リストメソッドを書く

//このメソッドで呼び出しています

0 投票する
1 に答える
60 参照

java - ショッピング カートが 2 回目以降の数量を更新しない

2 つの Java クラスを使用してショッピング カート プロセスを実装しようとしています。1つはカートのすべてのプロセスを保持CartItemするもう1つはです。ShoppingCart

これが私のものCartItemです:

ShoppingCartのクラス:

製品と出力を追加する方法は次のとおりです。

出力:

しかし期待される:

前もって感謝します。

0 投票する
2 に答える
1580 参照

java - CopyOnWriteArrayList を従来の ArrayList にコピーする方法

すでに通常の割り当てを試みました:

これはスローします:

COWArrayList を通常の ArrayList にコピーする方法はありますか?

0 投票する
2 に答える
243 参照

java - ArrayList、2 つのスレッドでサイズをチェック

リストがあります:

ArrayList リスト = 新しい ArrayList<>();

最初のスレッドで要素を追加します (高速です - 30/秒)。2 番目のスレッドで、そのサイズを読み取り、ファイルに出力します。

最初のスレッド:

2 番目のスレッド:

これはファイルの出力で、一部のみです: 1 1 1 3 3 5 4 6 7 7 9 11 8 9 12 10 14 16

それは間違っています。なぜなら、それは増加するだけだからです。1 1 1 はありえますが、11 8 はありえません。

私のプログラムは大きいですが、これらはこのリストの出現のみです (デバッグのためにコードの半分を削除しました)。list.remove()アプリ全体に等はありません。

質問があります。このように動作する可能性はありますか? そうでない場合は、コードのどこかに私の責任があります。

ええ、私は CopyOnWriteArrayList で試しました - 同じことです。ありがとう!