Согласованность Памяти Java LockSupport

Java 6 API вопрос. Не называя LockSupport.unpark(thread) есть происходит-перед отношение к возврату из LockSupport.park в просто-unparked нить? Я сильно подозреваю, что ответ да, но Javadoc, похоже, не упоминает об этом явно.

3 ответов


Я посмотрел, хотя код JDK и похоже, что методы LockSupport обычно вызываются вне блоков синхронизации. Итак, ваше предположение кажется верным.


я только что нашел этот вопрос, потому что я задаю себе тот же вопрос. Согласно в этой статье исследователем Oracle Давид Кости, ответ, кажется,нет. Вот соответствующая часть статьи:

если поток заблокирован в park() мы гарантируем, что последующее unpark() подготовлю его. Совершенно законный, но некачественный реализация park() и unpark() будет пусто методы, в которых программа вырождается в простое вращение. на самом деле это лакмусовая бумажка для правильного park()-unpark() использование.

пустой park() и unpark() методы не дают вам никакого происходит-перед гарантии отношения, поэтому для вашей программы, чтобы быть 100% портативный, вы не должны полагаться на них.

потом опять Javadoc из LockSupport говорит:

эти методы предназначен для использования в качестве инструментов для создания утилиты синхронизации более высокого уровня, а не сами по себе полезно для большинства приложений управления параллелизмом. The park метод предназначен для использования только в конструкциях вида:

while (!canProceed()) { ... LockSupport.park(this); }

так как вы должны явно проверить некоторые условия в любом случае, которые будут либо включать volatile или правильно синхронизированные переменные, слабые гарантии park() на самом деле не должно быть проблемой, правильно?


Если он не задокументирован как таковой, вы не можете полагаться на него, создавая отношения до.

В Частности LockSupport.java в коде Hotspot просто называет небезопасным.парк и. unpark!

на происходит-перед отношения, как правило, исходят из пары записи-чтения на флаге изменчивого состояния или что-то подобное.

помните, если это не задокументировано, как создание происходит-перед отношения, то вы должны относитесь к нему так, как будто это не так, даже если вы можете доказать, что это так в вашей конкретной системе. Будущие системы и реализации не могут. Они оставили себе эту свободу не без причины.