2つのJAVAメモリモデル(JMM)

  • JMMの紹介:

      Javaメモリモデルは抽象的な概念であり、実際には存在しません。指定された変数はメインメモリに保存されます。メインメモリは、すべてのスレッドがアクセスできる共有領域です。ただし、変数の操作は作業メモリで完了する必要があります(作業メモリは、JVMによってスレッドごとに作成されたプライベートデータ領域です)。最初に変数をメインメモリから独自の作業メモリにコピーしてから、変数を操作します。操作は完了し、メインに書き込まれます。メモリ。

  • 3つの特徴:

      1.可視性:多个线程操作共享数据彼此可见;
      アトミック2:操作是连续不可分割;
      3発注:计算机执行程序为了提高性能,编译器和处理器常常会对指令重排,分三种:1、编译器优化的重排;2、指令并行的重排;3、内存系统的重排,它们需要数据的依赖性来保证最终结果一致,可以禁止指令重排;

揮発性

  メモリの可視性と順序を保証できる軽量のロックであり(命令の順序変更は禁止されています)、原子性は保証されません。次のようなシナリオを使用します。ローカルプログラムキャッシュの同期、同期されているかどうかを判断するフラグは、揮発性で変更できます。

AtomicIntegerまたはAtomicReference

  原子性は、基礎となるCASアルゴリズムで実現できます。アルゴリズムには3つの値があります。1。メモリ値、2。推定値、3。更新値、メモリ値が推定値と等しい場合のみ、更新値がメモリ値に割り当てられ、それ以外の場合はスピンします。image.png

CASの完全な名前は、Compare And Swapです。これは、実行中に中断することが許可されていないCPU並行オリジナルステートメントです。

CASコアクラスはUnSafeクラスであり、このクラスのすべてのメソッドはネイティブに変更され、特定のメモリデータを直接操作できます。

CASの短所:長いサイクルタイムは非常にコストがかかり、共有変数のアトミック操作のみが保証されます。ABAの問題があります。スレッド1はメモリロケーションVから値Aを受け取り、スレッド2はメモリロケーションVから値Aを受け取り、それをBに変更してから、Aに変更します。この時点で、スレッドはAがまだメモリ内にあることを検出し、操作は成功しますが、このプロセスには問題があります。

ABAの問題を解決し、バージョン番号メカニズムを導入します。AtomicStampReferenceを使用できます。

元の記事を15件公開しました 賞賛されました0 アクセス73

おすすめ

転載: blog.csdn.net/xrzi2015/article/details/105592403