Java でメモリについて言及するとき、多くの人は JVM を思い浮かべるでしょう。この記事で説明したメモリ モデルもこれと誤解されます。実はこれも面接で間違いやすい試験ポイントです 記憶モデルの略称はjmmと英語名で表示されていると間違えにくいと思います。以下では、Java メモリ モデルの概念を説明し、jvm と区別できるようにします。
1. コンセプト
Java メモリ モデル (Java Main Memory、略して JMM) は抽象的な概念であり、コンピュータのメモリ モデルと多くの類似点があります。 JMM には主にスレッド、作業メモリ、および対話するメイン メモリが含まれます。作業メモリは計算のキャッシュにたとえられますが、スレッド間の作業メモリは互いに独立しています。メイン メモリはコンピュータのメイン メモリに似ています。 、スレッド間の変数値の転送は主にメインメモリを介して行われます。同時に、JMM にはコードの実行順序を最適化する命令の並べ替え機能もあります。簡単に言えば、コードが書かれる順序は、必ずしもコードが実行される順序ではありません。
2. JMMとJVMの違い
Java メモリ モデルは Java メモリ構造 (JVM メモリ構造) に似ているため、この 2 つが同じものであると誤解している人が多く、面接プロセスで誤った回答につながることがよくあります。
Java ヒープおよびメソッド領域は、複数のスレッドで共有されるデータ領域です。言い換えれば、複数のスレッドがヒープまたはメソッド領域に格納されている同じデータを操作できる可能性があります。これは、私たちがよく「Java スレッドが共有メモリを介して通信する」と呼ぶものです。
Java メモリ モデルは、英語の Java Memory Model (JMM) から翻訳されたものです。実際、JMM は JVM メモリ構造ほど現実には存在しません。それは単なる抽象的な概念です。 JSR-133: Java メモリ モデルとスレッド仕様では、JMM がマルチスレッドに関連することについて説明しており、あるスレッドが共有変数に書き込むときに、その共有変数が別のスレッドから参照できることを定義しています。 。
簡単にまとめると、Java のマルチスレッドは共有メモリを介して通信します。通信に共有メモリを使用するため、通信プロセス中に可視性、原子性、順序などの一連の問題が発生し、JMMこれは、マルチスレッド通信とそれに関連する一連の機能を中心に構築されたモデルです。 JMM は、Java 言語の volatile や synchronized などのキーワードにマップされるいくつかの構文セットを定義します。
上記は Java のメモリ モデルの概要であり、この記事では基本理論の共有に焦点を当てています。今後学習する際には、jmm と jvm の区別に重点を置くことができます。