私はvolatile
の基本的な考え方に精通しています(要約すると、複数のスレッドからアクセスできる値を含む命令のコンパイラの最適化を防ぐためです)が、volatile
と.NET 3.5私は現在のコンテキストで.NET 4を使用できません。volatile
はコレクション自体には適用されません。もちろん、コレクション(またはそれに対応するロックobject
)は複数のスレッドからアクセスするときにロックする必要がありますが、コレクションにvolatile
というマークを付けるべきではないという理由がありますか?コレクションのタイプは重要です(つまり、List
の値タイプとList
の参照タイプ)。(非並行)コレクションでvolatileを使用する必要がありますか?
答えて
Volatile almost certainly doesn't mean what you think it does.それはそれを使用しない主な理由です。 (最近、私は揮発性の意味を説明しようとすることを拒否します。それはきちんと説明するのは複雑すぎるし、あなたが間違いなくメモリモデルの専門家でなければ間違ったアプローチです。それはあなたに)
あなたが適切なオブジェクトにロックしている場合、それはあなたに何の利益を与えると思いますか?あなたはすでにロックを取得して解放するのに適切なメモリフェンスを通過しようとしています...変数自体にvolatile
を使用する理由が誤解に基づいていると思われます。
ロックを使用するだけで済みます。あなたが記述しているものにはvolatile
が必要です。
参照を変更していない場合(つまり、新しい無関係なコレクション全体を作成してフィールド内に置き換える場合)、volatile
は何も行いません。個人的には、おそらく、スレッド集約のケースでは、コレクションフィールドreadonly
をとすると、事故を防ぐために(そしてlock
を使用します)。
だからおそらく:いいえ。
私は 'readonly'というアイディアが好きです。それを考えなかった。 – Kongress
実際にコレクションの参照を変更していない場合(つまり、コレクションを参照する変数に新しいコレクションを繰り返し割り当てる場合)、その変数をvolatile
とマークする理由はありません。つまり、それはそうだと思う)。
もしあなたが(あなたが何をやっているのか疑問に思っても)lock
が適切であればvolatile
が必要であることは明らかではありません。
ところで、この主題は本当に難しいです。本当に、本当に、本当に難しい。
揮発性のコレクションにマークを付けると、コレクション全体ではなく参照自体がマークされます。
- 1. このフィールドはvolatileにする必要がありますか?
- 2. Androidは非ブロッキングソケットプログラミングで使用する必要があります
- 3. System.Net.WebClient - 非同期を使用する必要があります
- 4. mmap'edファイルによるIPC:アトミックおよび/またはvolatileを使用する必要がありますか?
- 5. Akkaのアクタのプロパティを@volatileにする必要がありますか?
- 6. AtomicReferenceをvolatileとして宣言する必要がありますか?
- 7. プリミティブなインスタンス変数をvolatileにする必要がありますか?
- 8. memorystreamsで非同期I/Oを使用する必要がありますか?
- 9. RecyclerViewでCursorLoaderを使用する必要がありますか?
- 10. DynamoDBでEC2を使用する必要がありますか?
- 11. Parcel.writeSerializableをParcelable.writeToParcelで使用する必要がありますか?
- 12. フォントでwebpackを使用する必要がありますか?
- 13. /csv:WriteAll()でError()を使用する必要がありますか?
- 14. ユニットテストでAutoMapperを使用する必要がありますか?
- 15. http.ListenAndServeでgoroutinesを使用する必要がありますか?
- 16. Erlangでワーカープールを使用する必要がありますか?
- 17. GCMでGooglePlayServicesを使用する必要がありますか?
- 18. ディスパッチブロックで「weakSelf」を使用する必要がありますか?
- 19. プロダクションコードでfmtを使用する必要がありますか?
- 20. Node.jsでBabelを使用する必要がありますか?
- 21. ngModelChangeをカスタムフォームコントロールで使用する必要がありますか?
- 22. ライブラリでモデルを使用する必要がありますか?
- 23. TestNGはSelenium Gridを使用して並列テストを実行する必要がありますか?
- 24. 並行Pythonを使ったクイックソート。入力としてXMLファイルを使用する必要があります
- 25. ItemsSourceを使用するには、Itemsコレクションが空である必要があります。
- 26. @synthesizeをまだ使用する必要がありますか?
- 27. C/gcc:スレッド間で共有されるグローバル変数はvolatileである必要がありますか?
- 28. メソッドシグネチャに 'volatile'がありますか?
- 29. HTML5構文を使用する必要がありますか?
- 30. DreamweaverのSpryを使用する必要がありますか?
ここで言及したように、volatileを使用したいという私の望みは、効果的なマルチスレッド動作を得るためにはvolatileとlockの両方を必要とする事実上の事実に基づいています。 – Kongress
@Kongress:非常に、非常に評判の良いソースから来ない限り、あなたが「揮発性」やマルチスレッドで読んだものは信用しないでください。ほとんどの書籍でさえそれが間違っています。 – jason
@Jasonフェア十分です。私はいつもわかっていないときに専用のロックオブジェクトを使用するように、私はいつもかなり心配していましたが、一般的に安全であるように(揮発性の)それを投げることはできません。私はそれを完全にやめて、ロックするだけでいいですか? – Kongress