メモリの可視性に関するご質問。原子変数はメモリの可視性を保証しますか?
CodeSample1:
class CustomLock {
private boolean locked = false;
public boolean lock() {
if(!locked) {
locked = true;
return true;
}
return false;
}
}
このコードは、最初のための、マルチスレッド環境のバグを起こしやすい「IF-THEN-ACT」と第二ため潜在的なメモリの、アトミックではありませんたとえば、threadAがフィールドをtrueに設定するが、後でフィールドの値を読み取るスレッドBがそれを認識せず、値falseを参照しているような可視性の問題。
最も簡単な解決策は、CodeSample2のようにsynchronizedキーワードを使用することです。
CodeSample2:
class CustomLock {
private boolean locked = false;
public synchronized boolean lock() {
if(!locked) {
locked = true;
return true;
}
return false;
}
}
今、私はアトミック変数を使用したい場合は、例えば、AtomicBoolean(質問はすべてアトミック変数に適用されます)、
CodeSample3:
public static class CustomLock {
private AtomicBoolean locked = new AtomicBoolean(false);
public boolean lock() {
return locked.compareAndSet(false, true);
}
}
さらにパフォーマンスの考慮事項を除いて、これで、AtomicBooleanを使用してCodeSample1から「if-then-act」と同様のロジックを実装しました。 本当にコードは論理的に、私が持っている質問は、それはすべての書き込み操作にあることは明らかですしながら、もし2つのスレッドは、右同じくらいの時間CodeSample3でロック()メソッドを呼び出して何あるんかは重要ではありませんAtomicBooleanを使用するとメモリの可視性が保証されますか?ただ、私はできるだけ明確渡って来ていることを確認したかった
長い物語のため申し訳ありません、みんなありがとう...
@ JamesJenkins質問があるときには、ドキュメントを読むのに便利です。 –