アトミック操作がデフォルトではない理由
Java では、インクリメント演算子 (i ) はアトミックではありません。アトミック性により、次の操作が開始される前に操作が完全に完了することが保証され、一貫性のある信頼性の高い結果が保証されます。ただし、インクリメント演算子のすべてのユースケースでアトミック性が必要なわけではありません。
マルチスレッド環境でカウンターをインクリメントする一般的なシナリオを考えてみましょう。アトミック性には共有変数への排他的アクセスが必要であるため、i を使用すると、ソフトウェア レベルとハードウェア レベルの両方でコストのかかる同期メカニズムが必要になります。
アトミック性がすべてのインクリメント操作に強制されると、アトミック性が適用されているシナリオでは重大なオーバーヘッドが発生します。必要ありません。たとえば、シングルスレッドのコンテキストでは、同じ変数を同時にインクリメントしようとする 2 つのスレッドの競合状態が問題にならないため、非効率なアトミック インクリメントは不要になります。
さらに、i アトミックにすると壊れてしまいます。 C や C などの一般的なプログラミング言語との互換性。さらに、Java では非アトミック形式のインクリメント (i = i 1) を使用する必要があるため、これらの言語から移行するプログラマにとっては混乱が生じる可能性があります。
アセンブリ命令レベルであっても、アトミック インクリメントは操作にはパフォーマンス上の欠点があることがよくあります。たとえば、x86 アーキテクチャでは、インクリメント命令をアトミックにするために特別な「ロック プレフィックス」が必要ですが、これにより追加のオーバーヘッドが発生します。
したがって、明示的なアトミック同期が存在しない場合、i は非アトミックのままになります。 Java での操作により、アトミック性が厳密な要件ではないシナリオでのパフォーマンスの最適化が可能になります。
以上がJava ではアトミック オペレーションがデフォルトではないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。