Java 8 добавила три забора до sun.misc.Unsafe
.Неверная ошибка Java Unsafe.storeFence()?
Я чувствую себя смущенным после того, как прочитал их документацию.
Итак, я искал в Интернете и нашел это link.
Согласно приведенной выше странице, я считаю, что эти методы практически не добавляют на практике. Поправьте меня, если я ошибаюсь, грубо говоря, 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();
Я полагаю перед тем означает, ранее и после означает позже.
EDIT
Я не имею в виду «мы не используем их в обычном развитии», когда я говорю эти «заборы ничего не добавляют на практике».
Я имею в виду, что даже без этих методов в Unsafe мы можем получить эти «заборы». Если я прав, на практике чтение фиктивной изменчивости имеет эффект loadFence(), и запись фиктивной изменчивости имеет эффект fullFence(), а эффект unsafe.putOrderedXXX() (или AtomicInteger.lazySet()) имеет эффект магазинаFence().
У них может быть тонкая разница, но в текущей реализации они могут быть обменными. (Кажется, подразумевается ссылкой)
Вот что я подразумеваю под словом «они ничего не добавляют».
ДРУГОЙ EDIT
Это уже исправлено.
См https://bugs.openjdk.java.net/browse/JDK-8038978
Спасибо @ джон-Vint
[ссылка реализации] (http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/50fdb38839eb/src /share/vm/opto/library_call.cpp#l3102), которые могут быть полезны. –