Есть что-то, что меня пугает с моделью памяти Java (если я все правильно понимаю). Если есть два потока A и B, нет никаких гарантий того, что B когда-либо увидит значение, написанное A, если оба A и B не синхронизируются на одном мониторе.
Для любой системной архитектуры, которая гарантирует согласованность кеширования между потоками, нет проблем. Но если архитектура не поддерживает когерентность кэша в оборудовании, это по существу означает, что всякий раз, когда поток входит в монитор, все сделанные ранее изменения памяти должны быть записаны в основную память, а кеш должен быть недействительным. И это должен быть кеш данных whole, а не только несколько строк, так как у монитора нет информации о том, какие переменные в памяти он защищает. Но это, безусловно, повлияет на производительность любого приложения, которое необходимо часто синхронизировать (особенно такие, как очереди заданий с работами с короткими работами). Так может ли Java работать на архитектуре без аппаратной кеширования? Если нет, почему модель памяти не дает более надежных гарантий относительно видимости? Не было бы более эффективным, если бы язык требовал информации о том, что охраняется монитором?
Как я вижу, модель памяти дает нам худшее из обоих миров, абсолютная необходимость синхронизации, даже если когерентность кэша гарантирована в аппаратном обеспечении, а с другой - плохая производительность на некогерентных архитектурах (полная очистка кеша). Так что не должно быть более строгим (требуется информация, охраняемая монитором) или больше потерять и ограничить потенциальные платформы кеш-когерентными архитектурами?
Как и сейчас, это не имеет для меня слишком большого смысла. Может кто-нибудь выяснить, почему была выбрана эта конкретная модель памяти?
EDIT: Мое использование строгих и проигравших было неудачным выбором в ретроспективе. Я использовал "строгий" для случая, когда делаются меньше гарантий и "теряются" для противоположного. Чтобы избежать путаницы, вероятно, лучше говорить о более сильных или слабых гарантиях.