意味
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;
}
}