最終的に私は知っている限り、変数/オブジェクトをキャッシュすることができることをCPUに伝えています(CPUとはCPUとはまったく異なります)。x86 CPUは本当にコアキャッシュL1を実行しています。 次の例では、オブジェクトmyObjectFinalがfinalとして設定されているため、CPUがキャッシュして内部の値を変更します。 myObjectが変更されることが保証されていないことを意味しますか?最終とメモリリーク
finalを設定すると参照が壊れ、CPUがキャッシュすることにしましたか?
myObjectを変更した場合、キャッシュされた最終結果もまた変更されることが保証されますか?
// thread 1
volatile MyObject myObject = new MyObject();
// thread 2
final MyObject myObjectFinal = myObject;
myObjectFinal.setData(1);
// thread 1
myObject.setData(2);
多分、コードは私の意図を正確には伝えません。だから、主な質問は:変更可能なオブジェクトを最終的にまたは揮発性にすることは、オブジェクトがCPUによってどのようにキャッシュされるかに影響を与えるかどうかです。それでは、変更可能なオブジェクトに対してfinalまたはvolatileを使用する必要があるときは、
CPUは変更可能なオブジェクトをキャッシュするか、またはfinal/volatileは絶対に影響を与えず、コーディングの一貫性のみに使用されますか?
あなたの質問は 'final'についてのものよりも' volatile'キーワードに関するものです。あなたの(メンバー)変数が 'volatile'宣言されていると、JVMは他のスレッドの変更が現在のスレッドで見えるようにします。 'volatile'キーワードなしでは、' final'キーワードを無視しません。 –
**オブジェクトmyObjectFinalがfinal **に設定されています - いいえ、 'Object'が' final'に設定されていない場合、**オブジェクト参照**が 'final'として設定されています。一般的に、「volatile」と「final」はプリミティブ型の可視性に意味があり、他のシナリオでは明示的な 'synchronization'が必要です。 –
@Sabir明らかに、私はオブジェクト参照にファイナルを置いています!オブジェクトをコピーする場合、またはプリミティブを使用する場合、私の質問は意味をなさないでしょう。あなたのコメントはまったく役に立たない。もう一度同期は揮発性とは異なります。この質問は、コードの一部をアトミックにしないCPUでのキャッシュについてです。 – chris