2016-11-16 8 views
0

ArrayList<Foo>があるとします。このリストは頻繁に変更されています。リスト内の要素の値であっても、常に変化する値を持ちます。このリストに対するすべての変更は、メインスレッドによって実行されています。独立したスレッドでのオブジェクトのJava深層クローンのリスト

メインスレッド(または少なくとも多くはない)を遅延させないように、リストのクローン作成(深層レベル、要素も複製する必要があります)リストには、すべてのFooオブジェクトの時間軸スナップショットが含まれています(元のリストと同じ値が再びスナップショットとして表示されます)。

ありがとうございます。私はソリューションが同期と関係していることを知っていますが、上記のすべての基準を満たすことはできません。

答えて

1

残念なことに、これに対する簡単な答えはありません。リストに加えられた変更がすでにスレッドセーフであれば、リスト(または同期に使用しているもの)のロックを取得し、コピーを作成してロックを解除することができます。アイテム自体の変更が同じロックを使用していることを確認する必要があります。

また、不変なコンストラクトを使用することもできます(ただし、リストだけでなくリストの内容についても同様に使用する必要があります)。ロックする必要はありません。リストのコピーを取得できますお暇な時に。

両方のアプローチには短所とリスクがあります。良いリソースが必要な場合は、Java Concurrency in Practiceを強くお勧めします。

+0

迅速な対応をありがとう!私はある種の例を探していましたが、正しい道で私を連れてくるのです。本へのリンクではありません。 – olta8

+0

CopyOnWriteArrayListはうまくいくようです。 – olta8

+0

CopyOnWriteArrayListは確かに便利ですが、項目自体(CopyOnWriteArrayListのfoosは)の変更には注意が必要です。そこではスレッド間の問題からあなたを救うことはできません... –

関連する問題