Volatile write = volatile read - PullRequest
       90

Volatile write = volatile read

0 голосов
/ 10 мая 2018

Я видел что-то вроде fld = fld несколько раз раньше, но во всех этих случаях фиктивная запись может быть устранена с лучшей производительностью.

public class Tst{
    public volatile int fld = 1;

    public void m(){
         //... Something
        fld = fld;
        //... Something else
    }
}

Вопрос в том, имеет ли такая фиктивная запись варианты использования или это какой-то обходной путь? Мне кажется, это точно так же, как (поскольку никакие магазины и загрузки не могут быть переупорядочены по фиктивной записи в соответствии с JMM)

public class Tst{
    public volatile int fld = 1;
    private static final Unsafe U;

    public void m(){
         //... Something
        U.fullFence();
        //... Something else
    }
}

1 Ответ

0 голосов
/ 10 мая 2018

Ваша фиктивная запись прервана, гарантированно произойдет изменчивая запись перед изменяемым чтением, в вашем «шаблоне» вы делаете обратное, поэтому может произойти переупорядочение.

fullFence гарантирует отсутствие переупорядочения, но это не то, что следует использовать.

...