Java的内存模型分为主内存,和工作内存。
主内存是所有的线程所共享的,工作内存是每个线程自己有一个,不是共享的。
线程工作时将要用到的变量从主内存拷贝到自己的工作内存,然后在工作内存中进行读和写。
写完之后,可能没被更新到主内存去。导致其他线程从主内存拷贝数据到自己的工作区时,拷贝的不是最新的数据。这就是内存可见性问题。
那么问题来了,Java的工作内存是什么??
百度 "java多线的工作内存是什么“,看了很多博客都说是各种缓存。
但是缓存不是大家都能访问的吗?
认证高级PHP讲师
ここでのキャッシュの定義は広すぎるため、曖昧さが生じる可能性があります。これを見てください lz
Java 仮想マシンの仕様では、さまざまなハードウェアやオペレーティング システムのメモリの違いを保護して、クロスプラットフォームのメモリ アクセス効果を実現する Java メモリ モデルを定義しています。
より良い実行パフォーマンスを得るために、Java メモリ モデルは、実行エンジンがプロセッサの特定のキャッシュを使用したり、メイン メモリ (RAM と比較できますが、RAM の一部であるキャッシュ) と対話することを制限しません。作業メモリ (キャッシュと比較でき、仮想マシン メモリの一部でもあります) はスレッドにとってプライベートです。
ワーキングメモリとメインメモリの分割は、Java ヒープ、スタック、メソッド領域の分割とは異なります。両者がかろうじて一致する場合、メインメモリはインスタンスデータ部分として理解できます。ヒープ内にあり、作業メモリはスタック内の領域の一部に相当します
-----引用
スレッドにはスレッド スタックがあり、メソッド呼び出しはスタック フレームです。スタックフレームは、ローカル変数領域、オペランドスタック、フレームデータ領域に分かれています。 ワーキングメモリとはローカル変数領域のデータであることが分かります。
@wlingxiao は、『JAVA 仮想マシンの詳細な理解』、第 2 版、12.3.1 メイン メモリとワーキング メモリで次のように述べています
ここでのキャッシュの定義は広すぎるため、曖昧さが生じる可能性があります。これを見てください lz
Java 仮想マシンの仕様では、さまざまなハードウェアやオペレーティング システムのメモリの違いを保護して、クロスプラットフォームのメモリ アクセス効果を実現する Java メモリ モデルを定義しています。
より良い実行パフォーマンスを得るために、Java メモリ モデルは、実行エンジンがプロセッサの特定のキャッシュを使用したり、メイン メモリ (RAM と比較できますが、RAM の一部であるキャッシュ) と対話することを制限しません。作業メモリ (キャッシュと比較でき、仮想マシン メモリの一部でもあります) はスレッドにとってプライベートです。
ワーキングメモリとメインメモリの分割は、Java ヒープ、スタック、メソッド領域の分割とは異なります。両者がかろうじて一致する場合、メインメモリはインスタンスデータ部分として理解できます。ヒープ内にあり、作業メモリはスタック内の領域の一部に相当します
-----引用
スレッドにはスレッド スタックがあり、メソッド呼び出しはスタック フレームです。スタックフレームは、ローカル変数領域、オペランドスタック、フレームデータ領域に分かれています。
ワーキングメモリとはローカル変数領域のデータであることが分かります。
@wlingxiao は、『JAVA 仮想マシンの詳細な理解』、第 2 版、12.3.1 メイン メモリとワーキング メモリで次のように述べています