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


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

3 7

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 просто называет небезопасным.парк и .распарковывать!

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

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