Является ли окончательное значение поля, назначенное в объявлении в классе 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);
        }
    }

}

0 ответов

Другие вопросы по тегам