Согласованность Памяти Java LockSupport
Java 6 API вопрос. Имеет ли вызов LockSupport.unpark(thread)
отношение happens-before к возвращению из LockSupport.park
в только что выделенном потоке? Я сильно подозреваю, что ответ-да, но Джавадок, кажется, не упоминает об этом явно.
3 ответа:
Я посмотрел, хотя код JDK и похоже, что методы LockSupport обычно вызываются вне блоков синхронизации. Итак, ваше предположение кажется верным.
Я только что нашел этот вопрос, потому что задавал себе тот же вопрос. Согласно этой статье исследователя Oracle Дэвида Дайса, ответ, по-видимому, будет нет. Вот соответствующая часть статьи:
Если поток заблокирован в
park()
, мы гарантируем, что последующий поток будет заблокирован вpark()
.unpark()
сделает его готовым. Совершенно легальный, но некачественный продукт. реализацияpark()
иunpark()
будет пустыми методами, в которых программа вырождается в простое вращение. а на самом деле это лакмусовая бумажка для правильногоpark()
-unpark()
Использование.Пустые
park()
иunpark()
методы не дают вам никакихслучается-до гарантий отношений, поэтому для того, чтобы ваша программа была на 100% переносимой, вы не должны полагаться на них.Затем снова, Javadoc LockSupport говорит:
Эти методы предназначены для использования в качестве инструментов для создания утилиты синхронизации более высокого уровня, и не находятся в самих себя полезно для большинства приложений управления параллелизмом. Метод
park
является предназначен для использования только в конструкциях вида:
while (!canProceed()) { ... LockSupport.park(this); }
Поскольку вам все равно нужно явно проверить какое-то условие, которое будет либо включать
volatile
, либо правильно синхронизированные переменные, слабые гарантииpark()
не должны быть проблемой, верно?
Если он не задокументирован как таковой, то вы не можете полагаться на него, создавая связь "случается до".
Конкретно LockSupport.java в коде Hotspot просто называет небезопасным.парк и .распарковывать!
Происходит-до того, как отношение обычно будет исходить из пары запись-чтение на флаге изменчивого состояния или что-то подобное.
Помните, если это не задокументировано как созданиепроисходит-до отношений, то выдолжны относиться к этому так, как будто это не так даже если вы можете доказать, что это так на вашей конкретной системе. Будущие системы и реализации могут этого не делать. Они оставили себе эту свободу по уважительной причине.