問題タブ [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.
java - 内部コレクション アイテムを公開する場合、Iterator または Iterable を使用する必要がありますか?
データのプライベートな可変リストを持つクラスがあります。
次の条件を指定して、リスト項目を公開する必要があります。
- リストは外部で変更可能であってはなりません。
- getter 関数を使用する開発者にとって、取得したリストを変更できないことは明らかです。
どのゲッター関数を推奨アプローチとしてマークする必要がありますか? または、より良い解決策を提供できますか?
UPD: この質問は、リスト ゲッター実装のベスト プラクティスに関する実際のコード レビュー ディスカッションからのものです。
java - ActiveMQ DestinationSource.getQueues 応答からキューを適切に反復する
何らかの理由で、次のコードでは単純な ではなくdestinationSource.getQueues()
が返されます。for ループはがいっぱいになる前に処理を開始し、その性質上ループ前の項目のみを処理するため、これは問題です。そこに を投入できることはわかっていますが、根本的な問題は解決しません。ではなくとして返される理由はありますか? また、反復中に追加されたものであっても、すべてのアイテムが確実にカバーされるようにする方法はありますか?CopyOnWriteArraySet
Set
Set
CopyOnWriteArraySet
Set
Thread.sleep()
CopyOnWriteArraySet
Set
CopyOnWriteArraySet
編集:ここに私が思いついた解決策がありますが、完全ではありませんが、キューが追加されるまでに1秒以上かかるまで、すべてのキューを確実に取得できます。
java - CopyOnWriteArrayList - スタックはどのように更新されますか?
の場合CopyOnWriteArrayList
、要素がコレクションに追加されるたびに新しいオブジェクトが作成されます。
以下の例を検討してください。
要素が追加されるたびに、新しいオブジェクトが作成さplayersUsing2
れ、スタック上の参照が更新されて、そのメモリ位置がポイントされます。理解できる。
ここで、別のメソッドに渡すplayersUsing2
ので、新しいスタック フレームが作成され、playersUsingNew
同じメモリ位置を指します。そして、新しい要素が追加されると、新しいオブジェクトが作成され、playersUsingNew
新しいメモリ位置を指します。
しかし、どのようにして最初のスタック フレームplayersUsing2
が更新され、最新のメモリ位置を指すのでしょうか?
実装を見ましjava.util.concurrent.CopyOnWriteArrayList.add(E)
たが理解できませんでした。処理するのはネイティブ コードと JVM によるものですか。
出力:
java - CopyOnWriteArrayList が遅すぎる
私は次のケースを持っています、
出力
これは、約 100 秒かかったのに比べて、かなりゆっくりと要素を追加します。ドキュメントで理由を知りましたが、ArrayList
0.004690843
ArrayList
基になる配列の新しいコピーを作成することによって、すべての変更操作 (追加、設定など) が実装されるのスレッドセーフなバリアント。
したがって、私の理解では、このリストに新しい要素を追加するたびに、新しい新しい配列が作成され、この配列の最後のインデックスに要素が追加されます。ロックインadd
メソッドを見つけましたが、それとは別に、そのメソッドは実際に毎回新しい配列を作成しています。
私が自分のプログラムを増やしMAX_NUMBER
たとき10_00_000
、プログラムは実行され続け、決して終了しません(そうなるでしょうが、私はそれほど長く待つことはできません)。
Collections.synchronizedList
速度でスレッドセーフが必要な場合は、より良い選択だと思います。私はそれを使用し、それは約かかりました0.007673728
。
私の質問:
- 内部的に新しい配列を作成するのはなぜスレッドセーフがこれに関連しているのでしょうか?
- の場合、なぜそんなに時間がかかったの
MAX_NUMBER = 10_00_000
ですか?( で約6秒かかったようにMAX_NUMBER = 10_00_00
)これは、ミュータティブ操作が毎回新しい配列を作成するために発生していますか? CopyOnWriteArrayList
これは、膨大な数の要素があり、他のものを選択した方がよい場合にパフォーマンスが低下することを意味しますか (つまりCollections.synchronizedList
)?CopyOnWriteArrayList
これが、パブリック API で通常見られない理由ですか? これ以外に欠点はありますか?
java - Javaで現在のコンテンツを上書きせずに外部テキストファイルに書き込むにはどうすればよいですか
見逃した応答を外部テキスト ファイルに書き込もうとしています。以下のメソッドは、認識されなかった応答を外部テキスト ファイルに保存しますが、以前のコンテンツを上書きします。上書きしないようにするにはどうすればよいですか?
//リストメソッドを書く
//このメソッドで呼び出しています
java - ショッピング カートが 2 回目以降の数量を更新しない
2 つの Java クラスを使用してショッピング カート プロセスを実装しようとしています。1つはカートのすべてのプロセスを保持CartItem
するもう1つはです。ShoppingCart
これが私のものCartItem
です:
私ShoppingCart
のクラス:
製品と出力を追加する方法は次のとおりです。
出力:
しかし期待される:
前もって感謝します。
java - CopyOnWriteArrayList を従来の ArrayList にコピーする方法
すでに通常の割り当てを試みました:
これはスローします:
COWArrayList を通常の ArrayList にコピーする方法はありますか?
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 で試しました - 同じことです。ありがとう!