«Синхронизированная» реализация

Насколько я помню, «синхронизированный» по существу сбрасывает все кэшированные значения при выходе и обеспечивает чтение всех значений из их основного местоположения при входе. Но мне интересно, как этого можно добиться? Я имею в виду, что когда блок содержит только чтение некоторых локальных значений, легко понять, что в блоке используются только эти локальные значения. А как насчет { xf(); } - кто знает, что он читает? Вызов даже может быть полиморфным, из-за чего JIT не сможет угадать, какой метод будет вызван, или он может включать отражение. Тогда кто знает, читает ли этот метод из какого-то кэшированного места, а не из основной памяти?

Итак, как JVM может узнать, какие значения сбрасывать/обновлять при входе/выходе из «синхронизированного» блока?Или вообще знаете, какие отношения HB необходимо установить? (т.е. знаете, к каким данным обращаются эти блоки?)

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

Я хотел бы знать, реализовано ли это именно так в какой-то конкретной JVM (скажем, в Azul), или, может быть, они используют какой-то другой подход, который мне почему-то не хватает.

ОБНОВЛЯТЬ. Я уже знаю, что Zulu работает не совсем так: в моем тесте f(x), похоже, не перечитывается из основной памяти при каждом вызове. Я тестировал его без «синхронизации», и внешние изменения не были видны этому методу. Но я считаю, что это потому, что метод на самом деле был встроенным, а не вызываемым, или, может быть, потому, что мой код был настолько простым, что JIT смог сделать вывод, что он не запрашивает HB для каких-либо данных, к которым осуществляется доступ в этом методе. Так что, возможно, мое предположение все еще верно, но только если не используются такие оптимизации.

0 ответов

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