Неправильная документация Java Unsafe.storeFence()?
Java 8 добавила три забора в sun.misc.Unsafe
,
Я чувствую растерянность после того, как прочитал их документацию.
Итак, я искал в Интернете, и нашел эту ссылку.
Согласно странице выше, я считаю, что эти методы практически ничего не добавляют на практике. Поправьте меня, если я не прав, грубо говоря, loadFence(), storeFence() и fullFence() соответствуют volatile read, lazy write и volatile write соответственно, хотя технически эти ограждения сильнее, чем volatile-переменные. Таким образом, 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()) - storeFence().
Они могут иметь небольшую разницу, но в текущей реализации они взаимозаменяемы. (Кажется, подразумевается по ссылке)
Вот что я имею в виду под "они не добавляют ничего нового".
ДРУГОЕ РЕДАКТИРОВАНИЕ
Это уже исправлено.
См. https://bugs.openjdk.java.net/browse/JDK-8038978
Спасибо @ Джон-Винт
2 ответа
На самом деле для этого есть различие в JDK9. Были похожие вопросы, которые были заданы и уточнены:
http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/84e19392365e
/**
! * Ensures that loads before the fence will not be reordered with loads and
! * stores after the fence; a "LoadLoad plus LoadStore barrier".
! *
! * Corresponds to C11 atomic_thread_fence(memory_order_acquire)
! * (an "acquire fence").
! *
! * A pure LoadLoad fence is not provided, since the addition of LoadStore
! * is almost always desired, and most current hardware instructions that
! * provide a LoadLoad barrier also provide a LoadStore barrier for free.
* @since 1.8
*/
public native void loadFence();
/**
! * Ensures that loads and stores before the fence will not be reordered with
! * stores after the fence; a "StoreStore plus LoadStore barrier".
! *
! * Corresponds to C11 atomic_thread_fence(memory_order_release)
! * (a "release fence").
! *
! * A pure StoreStore fence is not provided, since the addition of LoadStore
! * is almost always desired, and most current hardware instructions that
! * provide a StoreStore barrier also provide a LoadStore barrier for free.
* @since 1.8
*/
public native void storeFence();
/**
! * Ensures that loads and stores before the fence will not be reordered
! * with loads and stores after the fence. Implies the effects of both
! * loadFence() and storeFence(), and in addition, the effect of a StoreLoad
! * barrier.
! *
! * Corresponds to C11 atomic_thread_fence(memory_order_seq_cst).
* @since 1.8
*/
public native void fullFence();
Я считаю, что эти методы практически ничего не добавляют на практике.
Правильно, они не добавят ничего в 99,9% приложений. Это необходимо только в очень специфических случаях, если вам нужно вызывать этот метод напрямую, а не использовать конструкцию более высокого уровня.
volatile read, lazy write и volatile write соответственно,
Я читаю это как "изменчивое чтение, изменчивое запись, изменчивое запись и чтение" Кажется, что не существует барьера для отложенной / упорядоченной записи.
loadFence () - забор получения, а storeFence() - забор освобождения,
Я не верю, что это означает семантику приобретения / выпуска. Они более простые, чем это. Например, в этих методах нет изменения состояния. Для получения / выпуска требуется атомарная операция, такая как compareAndSet, которая является еще одним небезопасным методом.