4

私はそのような配列を宣言しprivate double[] array = new double[length]ます。この配列アイテムを1つのスレッドで更新し、別のスレッドで読み取るのは安全ですか?最新の価値はありますか?

配列を列挙しないことに注意してください。インデックスでのみアイテムにアクセスします。

4

3 に答える 3

4

配列はスレッドセーフではありません、MSDNから:

コレクションを介して列挙することは、本質的にスレッドセーフな手順ではありません。コレクションが同期されている場合でも、他のスレッドがコレクションを変更する可能性があるため、列挙子は例外をスローします。列挙中のスレッドの安全性を保証するために、列挙全体でコレクションをロックするか、他のスレッドによって行われた変更に起因する例外をキャッチすることができます。

一度に1つのアイテムだけを更新する場合は安全だと思いますが、それを証明するドキュメントが見つからない限り、信頼できません。

于 2012-07-06T07:50:26.070 に答える
2

揮発性は、値の鮮度を保証するものではありません。一部の最適化は妨げられますが、スレッドの同期は保証されません。

Doubleは、アトミックに更新されることが保証されていません。したがって、同期せずにdoubleの配列を更新/読み取ることは、部分的に書き込まれた値を読み取る可能性があるため、スレッドセーフではありません。

于 2012-07-06T08:03:31.983 に答える
0

いいえそうではありません。スレッドセーフを確保するために、セマフォまたはその他の方法を使用してロックシステムを設計する必要があります。生産者/消費者問題を確認できます。

于 2012-07-06T08:15:44.617 に答える