2014-01-15 16 views
5

私は、可変フィールドに^:unsynchronized-mutableという注釈が付いていたことに気づいたときに、clojureライブラリを勉強していました。可変は変更可能ですが、私は非同期の部分が何を意味するのかわからなかったので、私は含まれていdocsを、読んで:意味の意味は次のとおりです。volatile-mutable対unsynchronized-mutable?

注意も可変フィールドが正しく を使用することが極めて困難であり、唯一に存在していることClojure 自体で、Clojureの参照型などのより高い レベルの構造体の構築を容易にします。それは専門家のためのものです。 - 意味があり、意味のあるものが :volatile-mutableまたは:unsynchronized-mutableでない場合は、直ちに あなたには明らかではありません。

実際には、私が選んだ変更可能な注釈は問題ではありませんか、人々は変更可能な型を全く忘れるべきだと言っていますか?

そして、好奇心のために、抽象度の低いレベルでは、それらの意味の違いは何ですか?

ありがとうございます!

+3

をしたいです。 – Chuck

+0

ソースの例へのリンクが壊れていますが、警告のソースについて疑問を持っている人は、['deftype'](http://clojuredocs.org/clojure.core/deftype)のdocstringにあります。 – Mars

答えて

2

「人」は可変型の使用を忘れるべきではありません。それを使用する人は、非同期と揮発性の違いを知っている必要があります(そうでなければ、Clojure特有の問題ではないことを暗黙に指摘しています。単なる決定的な説明はわかりませんが、Clojureの変更可能なdeftypeフィールドを使用する前に、Javaメモリモデルとスレッド化と同期に関する一般的な知識が必要です。

私は決定的なリファレンスを手にしていませんが、ウィキペディアにはこのトピックにはuseful articleがあるようです(nbは今すぐ見つかりました。

+0

私は、それを使っている人なら違いを知るべきではないと思っています。しかし、それは、2つのフィールドタイプの意味を理解している人たちでさえ、ほとんどの場合、非常に強い落胆であると私に読んでいる、より高いレベルの構造を構築するためだけに存在するとも言います。 – Chuck

1

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

これらの2種類の可変性は、共有可能な可変データのスレッド間の一貫性を保証するための異なる戦略を持ち、その結果、読み書き操作のパフォーマンスが異なります。場合によっては、特定の種類の変更を使用するための微調整によって、より良いパフォーマンスを得ることができます。素朴な使い方をすると、奇妙で​​難しいバグを理解することができます。

2

これらはJavaの構造体です。なぜなら、「これを使用しないでください」を除いて、clojureのドキュメントのどこにも参照されていないからです。

読み書きは、「volatile」と宣言されたすべての変数に対してアトミックです。

非同期フィールドは、通常のJava可変フィールドです。

が、それはあなたがデータ構造を持っている場合は、複数のスレッドが読み取り用のデータにアクセスしたりするとき、常に一貫して揮発性目標を書くことを意味し、

https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.htmlは現実的に参照してください。つまり、そのデータの操作の直前または直後のデータオブジェクトを常に取得します。

それが100%意味をなさない場合は申し訳ありません。セマンティクスは、複合体です。あなたが深い理解を望むなら、これを読んでください:When exactly do you use the volatile keyword in Java?

tldr;

揮発性は、非同期よりわずかに性能が劣ります。より良いクロススレッドデータ保証を提供します。できれば

は両方それらを避けていますが、いずれかを使用する必要がある場合、あなたはおそらく、間違いなくあなたが** **可変フィールドを使用してはならないことを言っている:volatile-mutable