После прочтения JLS и глядя через несколько сценариев я не могу получить совершенно прав, какие правила делает модели памяти Java подчиняется внутрирегиональной резьбовыми семантикиJava в нити переназначения инструкции по одной и той же переменной
Рассмотрим этот код просто например цели:
public class CharIndexer {
public Map<char, int> charLastIndex;
public void changeCount(String phrase) {
Map<char, int> newCharLastIndex = new HashMap<char, int>();
for (int i = 0; i < s.length(); i++){
newCharLastIndex.put(s.charAt(i),i);
}
charLastIndex = newCharLastIndex;
}
}
в сценарии с несколькими потоками держит ссылку на тот же экземпляр CharIndexer, чтение поля charLastIndex в то время как один из них вызывает метод ChangeCount.
Было бы правильным переупорядочить, было ли задание для поля charLastIndex, последнего назначения метода, перед блоком for?
Это позволило бы потокам чтения увидеть карту, которая еще не была заполнена.
В то время как я согласен с тем, что гарантия видимости должна быть указана с помощью ключевого слова volatile, может ли семантика внутри потока разрешать такое переупорядочение?
выполнение однопоточных обоих заказов предоставляют те же результаты, но правила не регламентируют внутри нити переназначения, что бы избежать изменения порядка двух для блоков в этой реализации:
public class CharIndexer {
public Map<char, int> charLastIndex;
public void changeCount(String phrase) {
Map<char, int> newCharLastIndex = new HashMap<char, int>();
for (int i = 0; i < s.length(); i++){
newCharLastIndex.put(s.charAt(i),i);
}
// just changing values around
foreach(Map.Entry<char,int> charEntry : newCharLastIndex) {
charEntry.setValue(charEntry.getValue() * 10);
}
charLastIndex = newCharLastIndex;
}
}
Я пытаясь окутать голову, насколько далеко идет JIT-анализ, или если я не знаю конкретного набора правил для семантики внутри потока.
BTW, "intra-thread" означает в пределах одного потока. Переупорядочение внутри одного потока всегда является «порядком программирования» на Java. Другими словами, вы никогда не увидите переупорядочения, видимого в пределах одного потока. – markspace