[Java の基本] Java 可視化の前に起こること

意味

Happens-before 関係は可視性に関する問題を説明するために使用されますが、これは順番に 1 つずつ実行されると理解できます。

举例:小情侣一起做饭,小美女在洗米,小帅哥在弄电饭锅,
     必须等米洗完后,才能开始煮饭。

Java では、happens-before は 2 つのイベント間の時間シーケンスを定義するために使用される関係演算子であり、happens-before は Java のメモリ モデルでのみ機能します。視認性は確保されています。

最初の操作が 2 番目の操作より前に発生する場合 (これは、最初の操作と 2 番目の操作の間の事前発生関係とも言えます)、最初の操作は 2 番目の操作から可視である必要があると言えます。 2 番目の操作が実行されると、最初の操作の結果が確認されることが保証されます。

Java における前発生関係は、synchronized キーワードを使用して実現できます。synchronized キーワードは、複数のメソッドまたはコード ブロックを同期するように設定できます。つまり、1 つのスレッドのみがそれらにアクセスでき、他のスレッドは待機する必要があります。
以下は、synchronized キーワードを使用して前発生関係を実装する方法を示すサンプル コードです。

public class MyConcurrency {
    
      
    private static final Object lock = new Object();  
  
    public void method1() {
    
      
        synchronized (lock) {
    
      
            System.out.println("Method1 is executing");  
        }  
    }  
  
    public void method2() {
    
      
        synchronized (lock) {
    
      
            System.out.println("Method2 is executing");  
        }  
    }  
  
    public void method3() {
    
      
        synchronized (lock) {
    
      
            System.out.println("Method3 is executing");  
        }  
    }  
}

上記のサンプル コードでは、同期ロックとして lock という名前のオブジェクトを作成し、各メソッドでそれを synchronized キーワードで囲んでいます。これは、1 つのスレッドのみがメソッド 1()、メソッド 2()、およびメソッド 3() メソッドにアクセスできる一方で、他のスレッドは待機する必要があることを意味します。

事前の関係に関するルール

(1) シングルスレッドのルール: シングルスレッドでは、プログラムコードの順序に従って、最初に実行される操作が後から実行される操作より前になります。 (2) ロック操作のルール (ロックと同期インターフェイスなど)
:操作 A がロック解除され、操作 B がロックと同じロックになり、その後 hb(A,B) になります。
(3) 揮発性変数の規則: 揮発性変数への書き込み操作は、変数に対する読み取り操作が後に続く前に行われます。

事前発生関係を持たない例を挙げてください

比如多个线程同时对一个数进行操作,如下
public class Visibility {
    int x = 0;
    public void write() {
        x = 1;
    }

    public void read() {
        int y = x;
    }
}

おすすめ

転載: blog.csdn.net/fumeidonga/article/details/130328428