2016-08-03 13 views
0

は、だから私はQueueSetは、ほとんどのコレクションとは異なり、sizeメソッドは一定時間のオペレーションではない、ということに注意してくださいJavaの健全性チェック

ConcurrentSkipListSetから

を作ったオブジェクトを持っています。これらのセットの非同期性のため、現在の要素数を決定するには要素の走査が必要であり、このコレクションが走査中に変更されると不正確な結果が報告される可能性があります。さらに、一括操作addAll、removeAll、retainAll、containsAll、equalsおよびtoArrayは、アトミックに実行されることは保証されていません。たとえば、addAll操作と並行して動作するイテレーターは、追加された要素の一部のみを表示することがあります。

問題:そこ欠陥の健全性チェックは、このif(!activeQueueSet.add(queue))上ですが、何とかリスト非常に多くの状態を誤って解釈セット全体、すなわちそのO(n)の操作が横断されているマニュアルから見ることができるように回。私はこれについて絶対確実な健全性チェックを探しています。

+0

あなたが何を求めているのかはわかりません。 'size'が一定の時間操作でないという事実は、' add'メソッドが正しい値を返すかどうかを調べることと関係していますか? –

答えて

1

あなたConcurrentSkipListSet.add(element)がセットは、同時にここでweakly consistent、またはアトミックでないバルク方法(すなわち、xxxAll())である反復子を使用して別のスレッドによって変更されているかどうかに応じてtrue又はfalseを返すことができることは事実です。

ので、限り、あなたはだけ使用してセットを変更するよう、しかしadd()remove()メソッドは、スレッドセーフであることを気にしてくださいこれらのあなたは罰金になります。

あなたの特定のアプリケーションには、何をすべきかが決まります。要素がそこになかったが、追加された場合、それは良いです。要素が最初にあって追加されていないとそれはとても悪いですか?

非常に制御されたAPIを使用して、問題のある操作を防止したり、ロックを使用してスレッドを安全にすることができるように、ConcurrentSkipListSetを含むクラスを作成することができます。

+0

それはそれほど悪くなく、まれにしか起こりませんが、依然として対処する必要があるものです。私は伸ばすというあなたの考えがうまくいくと思います。 –

関連する問題