Автоматическая оптимизация для L кеша для переменных объекта? - PullRequest
0 голосов
/ 12 ноября 2018

Честно говоря, это продолжение это мой вопрос , вдохновленный этим ответом: https://stackoverflow.com/a/53262717/1479414

Предположим, у нас есть класс:

public class Foo {
    private Integer x;

    public void setX(Integer x) {
       this.x = x;
    }

    public Integer getX() {
       return this.x;
    }
}

И давайте рассмотрим очень специфический сценарий , когда у нас есть только два потока, которые взаимодействуют с переменной x:

В момент времени 1 создается поток T1

Во время 2 T1 устанавливает значение: foo.setX(123);

Во время 3 создается поток T2

В момент 4 T2 считывает значение: foo.getX();

Другие темы не взаимодействуют с этим значением.Обе операции выполняются только один раз.

Таким образом, нет очевидных x операций чтения значения до того, как поток T2 выполнит свою работу.

Вопрос: существует ли какая-либо автоматическая оптимизация для L-кэша, котораяможет кешировать null значение переменной x, поэтому поток T2 будет читать его кэшированное значение?Другими словами, нужен ли нам модификатор volatile в этом конкретном сценарии?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Когда вы создаете поток, он будет видеть любое значение, установленное до его создания.

В Javadoc для java.util.concurrency для Java 11 под Свойства видимости памяти и JLS-17.4.5 для Java 8 состояния

Вызов для запуска в потоке происходит до любого действия в запущенном потоке.

ПРИМЕЧАНИЕ. Поток считывает кэшированное значение только тогда, когда он перечитывает значение в строке кэша, которую он уже имеет в своем кэше. Если он читает строку кэша, которую он никогда ранее не читал или больше не находится в кэше, он не будет читать устаревшее значение.

0 голосов
/ 12 ноября 2018

T1 и T2 выполняются последовательно, а кэш является когерентным , особенно в этом последовательном случае использования.

Таким образом, невозможно, чтобы T2 во время 4 получило нулевое значение.

...