Является ли окончательное значение поля, назначенное в объявлении в классе Java, гарантированно для чтения в другом потоке?
Как мы знаем, в следующем примере reader
гарантированно считывает последнее значение поля 10, потому что барьер памяти StoreStore добавляется после this.value = value
предложение и перед неявным return
в конструкторе согласно спецификации языка Java.
public class Main {
static Main main;
final int value;
public Main(int value) {
this.value = value;
}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
Main.writer();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
Main.reader();
}
}).start();
Thread.sleep(10000L);
}
/**
* executed by thread1
*/
public static void writer() {
main = new Main(10);
}
/**
* executed by thread2
*/
public static void reader() {
if (main != null) {
int c = main.value;
System.out.println(c);
}
}
}
Сейчас reader2
гарантированно считывает последнее значение поля 10, как в следующем примере?
public class Main {
static Main main;
final int value = 10;
public Main() {}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
Main.writer();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
Main.reader2();
}
}).start();
Thread.sleep(10000L);
}
/**
* executed by thread1
*/
public static void writer() {
main = new Main();
}
/**
* executed by thread2
*/
public static void reader2() {
if (main != null) {
int c = main.value;
System.out.println(c);
}
}
}