問題タブ [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 投票する
2 に答える
85 参照

java - サーブレットの CopyOnArrayList によるスレッド セーフ

サーブレットとスレッド化を始めたばかりです。Final インスタンス変数はスレッド セーフであり、CopyOnArrayList も同様です。次のコードがスレッドセーフではないのはなぜですか (これは最終的なものです + CopyOnArrayList を使用しました)。

JSP コード:

最初に 3 つの Cat インスタンスを取得します。更新すると 6 になり、次に 9、12 などになります。なぜですか? この問題は、doGet メソッド内で CopyOnWriteArrayList を宣言した場合や、単純な配列で宣言した場合には発生しません。その背後にあるロジックがわかりません: final インスタンス変数と CopyOnWriteArrayList はスレッドセーフでなければなりません。これを明確にしていただきありがとうございます。

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

java - CopyOnWriteArrayList のスレッドのイテレータが機能しない

OCP 試験の演習を行っています。現時点では、複数のスレッドを使用しているときにCopyOnWriteArrayList内容出力しようとしました。ドキュメントによると、 CopyOnWriteArrayList のイテレータは

イテレータが作成された時点で存在するリスト内の番号を出力します

そのため、あるスレッドが CopyOnWriteArrayList に書き込みを開始し、のスレッドが CopyOnWriteArrayListから読み取りを開始すると、(時々) いくつかの項目が出力されると予想されます。書き込みスレッドが終了したに CopyOnWriteArrayList をトラバースすると、新しいイテレータがすべてのアイテムを出力することが期待されます。

残念ながら、Runnable インターフェイスの匿名実装を使用している場合、これは機能しません。ただし、CopyOnWriteArrayList への参照を渡すカスタム スレッド クラスを使用する場合は機能します。

今のところ、なぜこれが起こるのかわかりません。この効果が発生するかどうかはわかりませんfinal CopyOnWriteArrayList<Integer> intList = new CopyOnWriteArrayList<>();が、そうである場合は、その理由がまったくわかりません。

このトピックに関するご意見をお待ちしております。

Runnable の匿名実装の使用 - 期待どおりに動作しない

出力 (時々 - スレッドがあるため) 最初の読み取りスレッドはいくつかの数値を出力しますが、2 番目の読み取りスレッドは数値を出力しません!

カスタム スレッド クラスの使用 - 期待どおりに動作します

出力 - 期待どおりに動作します 最初の読み取りスレッドはいくつかの数値を出力し、2 番目の読み取りスレッドはすべての数値を出力します

現在、JDK 1.7.0_25 および Eclipse Mars Release 4.5.0 を使用して、Win10 マシンで作業しています。

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

java - 異なる場所で同時にリストを変更するJava

次のように、イテレータを使用して ArrayList をトラバースしているこのコードがあります。

'handle(Element element)' は次のようになります。

iterator最初のメソッドが新しく追加された要素で更新されないため、これにより ConcurrentModificationException が発生します。

私は現在、CopyOnWriteArrayListを使用してこれを解決しましたが、これらはパフォーマンスに非常にコストがかかります。これを修正するより良い方法はありますか?

前もって感謝します!

(注:この例は意味がありませんが、私が直面していることを説明するために作成されました)


なぜ私がこれをしているのかを説明しようとします:

  • メインクラスに実行する必要がある「コマンド」のリストがあります

  • これらのコマンドを反復して 1 つずつ実行し、実行時にリストから削除する while ループ (例のコード 1) があります。

  • コマンドの実行中、このコマンドは、メイン クラスに保存されているリストに新しいコマンドを追加できます。(これは実際にはもう少し複雑です。コマンドを処理するとクライアントからの応答が要求され、クライアントはコマンドで応答し、保存されたリストに追加されます)。

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

android - 配列リストを配列に変換するには?

JSON 値を含む配列リストがあります。それを配列に変換したいので、MapActivity に送信します。いろいろな方法を試しましたが失敗しました。

0 投票する
0 に答える
18 参照

java - Androidのcopyonwritearraylist

私たち全員が知っているように、CopyOnWriteArrayList は、リスト内の値を変更したいときに Java で multiThread がアクセスしたときに問題を解決でき、メモリ内にコピーを作成します。しかし、Android では、get() などのこのメソッドを呼び出すと、ConcurrentModificationException がスローされることがあります。これは、Android で CopyOnWriteArrayList の subList() を呼び出すと、CowSubList というオブジェクトが作成され、Slice というメソッドがあるためです。 .checkConcurrentModification() がスローされ、ConcurrentModificationException がスローされます。スレッドがリストにアイテムを追加していて、別のアイテムがリストにアクセスしている場合、問題を解決するにはどうすればよいですか?

0 投票する
0 に答える
248 参照

java - 処理後の CopyOnWriteArrayList のスレッドセーフなクリア

特定の時間間隔で実行され、リスト内の各項目を処理するスレッド内CopyOnWriteArrayListのメソッドによって反復される を使用する Java プログラムがあります。update()リスト内のアイテムはスレッドセーフではないため、変更するアイテムと、メソッドがリストを反復処理するCopyOnWriteArrayListタイミングを知るために使用されるさまざまなバッファーを使用して、アイテムの変更を処理しています。update()

問題は、これらのバッファーを使用した後、clear()それらを使用したことですが、バッファーが使用されてからクリアされるまでの間にアイテムがバッファーに追加された可能性があることです。

例えば:

例 2:

synchronizeこれらのリストを読み取り/変更するコードブロックの周りを使用すると、メインスレッドがロックアップする原因になるのではないかと心配しています (変更の呼び出し元)。アイテムの反復中に発生する処理にはしばらく時間がかかるためです (Pythonスクリプトが呼び出されて待機します)。それが、そもそもバッファを使用している理由です。

私が言及した方法のいずれかよりもこれを行うためのより良い方法はありますか?

update()どちらの例も、スレッドの「無限」while ループにあるメソッドで実行されるコードを示していることに注意してください。

アップデート

を使用ConcurrentLinkedQueueすると、例 2 の問題が解決されるようです。しかし、基本的にはすべてのノードをmainList. ConcurrentLinkedQueueメソッドがあれば最高です.pollAll()

また、次の例では、アイテムを から繰り返し削除するmainList必要がありますが、これはCopyOnWriteArrayList. もう1つにする必要があるかどうかはわかりませんが...

例 3: