Java は、そのアトミック クラスを通じて CAS 操作を公開します。
AtomicInteger.compareAndSet(expected,update)
の場合expected == update
、これらの呼び出しはノーオペレーションですか、それとも揮発性の読み取りと書き込みのメモリ整合性の影響がまだありますか (の場合のようにexpected != update
)?
Java は、そのアトミック クラスを通じて CAS 操作を公開します。
AtomicInteger.compareAndSet(expected,update)
の場合expected == update
、これらの呼び出しはノーオペレーションですか、それとも揮発性の読み取りと書き込みのメモリ整合性の影響がまだありますか (の場合のようにexpected != update
)?
私はネイティブコードを調べましたが、値が等しいことに関連して違いはないようです。特にこの場合、整数の等価性は参照に対してそうしないためです。
イベントで同じメモリ一貫性を持つ同じロジックを実行します。expected != update
1 つの注意点は、フィールドの場所には常に少なくとも揮発性の負荷がかかるため、少なくともバッキング int フィールドの揮発性の読み取りが発生することです。
私の知る限り、動作のチェックexpected == update
も変更もありません。そうすることで、ハードウェアがまだそれを行っていない場合、サイクルが追加される可能性がありますが、そうではないと思います。
いずれにせよ、CAS 呼び出しの副作用に依存するコードは書きません。
もちろん可能性が高いと思われる場合は、自分でチェックを追加できます。