Возможно, это должен быть отдельный вопрос ... но это очень наглядно. Это более обширная версия комментария, который я сделал ранее.
Первая часть раздела 17.4 JLS гласит:
Чтобы определить, являются ли действия потока t в выполнении законными, мы просто
оценить реализацию потока т, как это будет выполнено в одном
многопоточный контекст, как определено в остальной части этой спецификации.
Место, где я зацикливаюсь, это понимание того, что означает «как определено в остальной части этой спецификации», в отношении порядка программ.
В данном случае присвоение
f = new FinalFieldExample();
подчиняется семантике присваивания (раздел 15.26.1), к которой относится следующее. В спецификации это сбивает с толку неправильно (особенно третий шаг), я думаю, что я переформатировал его, чтобы точно отразить намерение.
[В противном случае] требуется три шага :
- Сначала вычисляется левый операнд для получения переменной. Если эта оценка завершается преждевременно, то выражение присваивания завершается преждевременно по той же причине; правый операнд не оценивается, и присвоение не происходит.
- В противном случае вычисляется правый операнд. Если эта оценка завершается преждевременно, то выражение присваивания завершается преждевременно по той же причине, и назначение не происходит.
- В противном случае значение правого операнда преобразуется в тип левой переменной, подвергается преобразованию набора значений (§5.1.13) в соответствующий набор стандартных значений (не расширенный -экспоненты значения), а результат преобразования сохраняется в переменной.
Это читается как спецификация однопотокового "порядка программ" для меня. Что я неправильно понимаю?
Ответ, возможно, заключается в том, что на самом деле подразумевается «тест на утку» - если один поток выполняет , как если бы все было сделано в указанном порядке, это правильная реализация. Но этот раздел написан совсем не так, как в других местах, где это делается с помощью слова , появляются , например ::
Язык программирования Java также гарантирует, что каждый операнд оператора (кроме условных операторов &&, || и? :) выглядит как для полной оценки перед выполнением любой части самой операции.