別のスレッドから非揮発性フィールドに書き込むと、おそらくそれをキャッシュできるので、他のすべてのスレッドが実際の値を認識しないことはすでにわかっています。しかし、たとえばstart()
、割り当て値をフィールドに割り当てた後にスレッドオブジェクトで呼び出すと、JVM は他のすべてのスレッドのこの値を更新します。しかし、同じアクションを実行する場合、JVM はこのフィールドの値を更新しますが、次のようにフィールドに直接ではなくobject.field = 100
メソッドを呼び出して値を割り当てますobject.setFiled(100)
。
public class Main {
int value;
public static void main(String[] args) {
Main main = new Main();
main.value = 100;
new Thread(() -> System.out.println(main.getValue())).start();
この場合、フィールドの値は他のすべてのスレッドで確実に同じになります
}
public int getValue() {
return value;
}
}
public class Main {
private int value;
public static void main(String[] args) {
Main main = new Main();
main.setValue(100);
new Thread(() -> System.out.println(main.getValue())).start();
しかし、この場合、結果は同じでしょうか?
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}