4. 3
Reordering
int a, b;
void foo() {
int l1 = a;
int l3 = b;
int l2 = l1 + 10;
int l4 = l2 % 3;
}
int a, b;
void foo() {
int l1 = a;
int l2 = l1 + 10;
int l3 = b;
int l4 = l2 % 3;
}
5. 4
Reordering – ограничения
int a, b;
void foo() {
int l2 = l1 + 10;
int l1 = a;
int l3 = b;
int l4 = l2 % 3;
}
int a, b;
void foo() {
int l1 = a;
int l2 = l1 + 10;
int l3 = b;
int l4 = l2 % 3;
}
Reordering не меняет семантику кода в
одном потоке
10. Data race
9
• Один поток читает данные
• Второй поток пишет данные
• Эти два действия не синхронизированы
11. Java memory model
10
«A memory model describes, given a program and an
execution trace of that program, whether the execution
trace is a legal execution of the program.»
JSR 133
29. Links
28
• https://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf
JSR 133
• http://shipilev.net/blog/2014/jmm-pragmatics/
Очень крутое объяснение JMM
• http://developer.android.com/intl/ru/training/articles/smp.html
Гайд по MM в Android
• http://gee.cs.oswego.edu/dl/jmm/cookbook.html
JMM для авторов компиляторов
• http://jcip.net/
Отличная книга про JMM