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

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

3 ответа

Решение

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

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

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

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

С другой стороны, Javadoc LockSupport говорит:

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

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

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

Если это не задокументировано как таковое, вы НЕ МОЖЕТЕ полагаться на то, что это произойдет раньше, чем отношения

В частности, LockSupport.java в коде Hotspot просто вызывает Unsafe.park и.unpark!

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

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

Другие вопросы по тегам