7

可変フィールドに^:unsynchronized-mutable の注釈が付けられていることに気付いたとき、私は clojure lib を研究していました。ミュータブルはミュータブルですが、非同期部分が何を意味するのかわからなかったので、以下を含むドキュメントを読みました。

ミュータブル フィールドを正しく使用するのは非常に難しく、Clojure 自体で Clojure の参照型などのより高いレベルの構造を構築しやすくするためにのみ存在することに注意してください。これらは専門家向けです。:volatile-mutable または :unsynchronized-mutable のセマンティクスと意味がすぐにわからない場合は、使用しないでください。

ニュアンスを理解できませんでした:実際には、どの可変性アノテーションを選択しても問題ないということですか、それとも可変型の使用を完全に忘れるべきだと言っているのでしょうか?

そして、好奇心のために、より低いレベルの抽象化では、それらの間のセマンティックの違いは何ですか?

ありがとう!

4

3 に答える 3

2

まあ、「人々」が可変型の使用を忘れるべきだと言っているわけではありません。それらを使用する人は、非同期と揮発性の違いを知っている必要があると言っています(そして、これはClojure固有の問題ではないことを暗示しています。それ以外の場合はdocstringで説明されます)。決定的な説明を 1 つも手つかずで知っているわけではありませんが、Clojure の変更可能な deftype フィールドを使用する前に、Java メモリ モデル、およびスレッド化と同期全般について理解する必要があります。

手元に決定的な参考文献はありませんが、ウィキペディアにはこのトピックに関する有用な記事があるようです(今見つけたので、ざっと目を通しただけです)。

于 2014-01-15T08:51:26.137 に答える
1

と の違いがわからない場合は、変更可能なフィールドを直接使用するのではなく、Clojure の参照型を使用する必要が:volatile-mutableあります。:unsynchronized-mutable

これら 2 種類の可変性には、共有可変データのスレッド間の一貫性を保証するための異なる戦略があり、その結果、読み取り/書き込み操作のパフォーマンスが異なります。特定の種類のミュータビリティを使用するように微調整することで、パフォーマンスが向上する場合があります。単純に使用すると、バグが奇妙で理解しにくくなる可能性があります。

于 2014-01-15T17:06:38.673 に答える