Java 8 добавила три забора в sun.misc.Unsafe
.
Я чувствую смущение после того, как прочитал их документацию.
Итак, я искал в Интернете и нашел ссылку .
Согласно вышеприведенной странице, я считаю, что эти методы практически ничего не добавляют на практике. Поправьте меня, если я ошибаюсь, грубо говоря, loadFence(), storeFence() и fullFence() соответствуют волатильному чтению, ленивой записи и volatile write соответственно, хотя технически эти заграждения сильнее, чем изменчивые переменные. Таким образом loadFence() - это забор, а storeFence() - это забор, а fullFence() - полный забор.
Но тогда документация для storeFence() выглядит странно.
В нем говорится:
/**
* Ensures lack of reordering of stores before the fence
* with loads or stores after the fence.
*/
void storeFence();
Это не похоже на забор. Как он должен использоваться? Не должно быть
/**
* Ensures lack of reordering of loads or stores before the fence
* with stores after the fence.
*/
void storeFence();
Я предполагаю до раньше и после означает позже.
ИЗМЕНИТЬ
Я не имею в виду "мы не используем их в обычном развитии", когда я говорю, что эти "заборы ничего не добавляют на практике".
Я имею в виду, что даже без этих методов в Unsafe мы можем получить эти "заборы". Если я прав, на практике чтение фиктивной изменчивости имеет эффект loadFence(), и запись фиктивной изменчивости имеет эффект fullFence(), а эффект unsafe.putOrderedXXX() (или AtomicInteger.lazySet()) имеет эффект of storeFence().
У них может быть тонкая разница, но в текущей реализации они могут быть обменными. (Кажется, подразумевается ссылкой)
Вот что я подразумеваю под словом "они ничего не добавляют".
ДРУГОЕ ИЗОБРАЖЕНИЕ
Это уже исправлено.
См. https://bugs.openjdk.java.net/browse/JDK-8038978
Спасибо @john-vint