3

メモリの可視性に関するご質問。原子変数はメモリの可視性を保証しますか?

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を使用するとメモリの可視性が保証されますか?ただ、私はできるだけ明確渡って来ていることを確認したかった

長い物語のため申し訳ありません

、みんなありがとう...

答えて

0

それは、フィールドへの書き込み操作は、現在行われることは明らかだが、私が持っている疑問は、2つのスレッドが右ほぼ同じ時間CodeSample3でロック()メソッドを呼び出す場合は何ですatomically、AtomicBooleanの使用はメモリの可視性も保証しますか? AtomicBooleanについては

は、メモリの可視性を保証するあり、同時に異なるスレッドからの複数の操作を処理します。 volatileフィールドをラップするため、保証を行うことができます。 volatileの言語セマンティクスは、複数のスレッドが最新の値を参照し、すべての更新がメインメモリに発行されるようにメモリバリアが交差することを保証します。

Btwの場合、lock(...)メソッドはロックを行わない可能性がありますので、tryLock(...)の準備ができているはずです。

関連する問題