2016-08-16 4 views
1

誰もがスレッドセーフではなく、複数のスレッドで使用されているJavaでコレクションを変更した場合の結果を教えてください。スレッドセーフではないコレクションを変更する

+1

結果:コレクションの内部構造が壊れている可能性があります。 – Andreas

+1

[Nasal demons。](http://www.catb.org/jargon/html/N/nasal-demons.html)つまり、悪魔はあなたの鼻から飛び出すことがあります。 –

+0

関連:http://stackoverflow.com/questions/22632552/concurrent-add-on-non-threadsafe-hashset-what-is-the-worst-that-c​​ould-happen – Marco13

答えて

0

結果は未定義で、ややランダムです。

高速で動作しないように設計されたJDKコレクションでは、ConcurrentModificationExceptionが発生することがあります。これは、他のクラスとは対照的に、コレクションでスレッドの安全性に特有の唯一の結果です。スレッドセーフでないクラスと一般的に発生し

問題が発生する可能性があります。

  • コレクションの内部状態が壊れている可能性があります。
  • 突然変異は成功したように見えるかもしれませんが、変更は実際にはいつでも他のスレッドには見えません。最初は目に見えず、後で見ることができます。
  • 軽負荷では実際には成功するかもしれませんが、競合しているスレッドがたくさんあるため、重い負荷でランダムに失敗します。
  • 上記のコメントに記載されているように、競合状態が発生する可能性があります。

他にもたくさんの可能性がありますが、どれも楽しいものはありません。最悪の場合、これらのことは、システムがストレスを受けているときに、生産において最も一般的に明らかになる傾向があります。

要するに、あなたはおそらくそれをしたくありません。

0

データ構造の不変量は保証されません。スレッド1がDSスレッド1に追加している間にスレッド2が読み取りを行う場合、スレッド2は要素がまだ追加されていないと見なすことができる。

スレッドセーフではないデータ構造がたくさんありますが、それでもマルチスレッド環境では機能する(つまりスローされない)と思われます。また、特定の状況下で正しく実行することもできますデータ構造への任意の書き込み)。

このトピックを十分に理解するには、並行システムで発生するさまざまな種類のバグを調べることをお勧めします。この短い文書は、良いスタートのようです。

http://pages.cs.wisc.edu/~remzi/OSTEP/threads-bugs.pdf

0

最も一般的な結果は、それが動作するように見えますが、すべての時間を動作しません。

これは、あなたが

    つのマシン上で動作しますが、他にはない
  • 問題を抱えている意味することができます。
  • はしばらくは動作しますが、明らかに無関係な変更やプログラムが中断します。
  • スレッドセーフなデータ構造を使用していない場合は、マルチスレッドの問題かどうかわからないときはいつでもバグがあります。

何が起こる可能性がありますか。

  • あなたはめったに/ランダム唯一のオプションはであり、あなたのコードは無限ループに入り、(HashMapのは、これを行うために使用される)動作を停止し、エラーや奇妙な動作

を取得します。

  • スレッド間で共有される状態の量を制限します。理想的には全くありません。
  • データの更新方法には十分注意してください。
  • 単体テストに依存していないので、コードが何をしているのか理解して、すべての可能な状況で正しく動作することを確認する必要があります。
関連する問題