Upload
secon
View
149
Download
4
Embed Size (px)
Citation preview
JMM in Android
Максим ЕфимовAndroid team leader, Google developer expert
0
О чем будем говорить?
• Зачем понадобилась JMM
• Happens-before
• ARM vs x86
1
Естественный порядок
2
int a, b; void foo() { int l1 = a; int l2 = l1 + 10; int l3 = b; int l4 = l2 % 3; }
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; }
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 не меняет семантику кода водном потоке
Нотация записи
5
A==B==0
r1=AB=1
r2=BA=1
общее для обоих потоков
происходит в первом потоке происходит во втором потоке
r1=? r2=?
Reordering в многопоточности
6
A==B==0
r1=Ar2=B
B=1 A=1
Ожидаем (r1, r2) (0, 0),(1, 1),(0, 1)
A==B==0
r1=Ar2=B
A=1 B=1
Получаем (r1, r2) (0, 0),(1, 1),(0, 1),
(1, 0)
Семантика нарушается
Нужно больше порядка
7
Action 1.1
Action 1.2
Sync action 1
Sync action 2
Action 2.1
Action 2.2
Action 2.3Action 1.3
Action 1.4 Action 2.4
Поток 1 Поток 2
Порядок
междупотоками
Синхронизация
8
Monitor.Lock()
Action 1.2
Monitor.Unlock()
Monitor.Lock()
Action 2.1
Action 2.2
Action 2.3Action 1.3
Action 1.4 Monitor.Unlock()
Поток 1 Поток 2
Data race
9
• Один поток читает данные • Второй поток пишет данные • Эти два действия не синхронизированы
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
JMM философия
11
Порядок выполнения может быть любой, кроме запрещенных порядков
Что есть в JMM?
12
• Sequential consistency • Happens before• Causality
finals, word tearing…
Happens before I
13
Monitor.unlock() Monitor.lock()HB
volatile write volatile readHB
Thread.start() 1st thread actionHB
last thread action Thread.terminate()HB
Thread.interrupt() interrupt detectedHB
default write 1st accessHB
constructor finalizerHB
Happens before II
14
read writeHB
one more write read
HBwrite
HB
read writeМожет видеть
+
=
Happens before III
15
N action in thread N+1 action in threadHB
HB пример
16
Monitor.Lock()
x = 1
Monitor.Unlock() Monitor.Lock()
b = xx = 3
Monitor.Unlock()
Поток 1 Поток 2
HBx = 2
b = ?
a = x a = ?
HB достаточно?
17
A==B==0
r1=A if(r1 != 0) B=1
r2=B if(r2 != 0) A=1
Ожидаем (r1, r2) = ?
HB недостаточно
18
A==B==0
r1=A if(r1 != 0) B=1
r2=B if(r2 != 0) A=1
(r1, r2) = (0, 1)
r1=A B=1 if(r1 == 0) B=0
Causality
Memory model @ Dalvik
19
DMM
x86 ARM
x86 vs ARM
20
• read\read • store\store • read\store • store\read
• read\read• store\store• read\store • store\read
ARM x86
No barriers I
21
A==B==falseA=truer1=B if(!r1) crit()
B=truer2=A if(!r2) crit()
No barriers II
22
A==B==false
A=truer1=B if(!r1) crit()
B=truer2=A
if(!r2) crit()
r1=B
A=true if(!r1) crit()
x86 vs ARM I
23
A==B==0
A=41B=1
loop_until(B==1)r1=A
x86 vs ARM II
24
A==B==0
B=1
A=41
loop_until(B==1)r1=A
A=41B=1 ARM
ARM address dependency
25
[A+8]==B==0
[A+8]=1 store/store B=16
loop: r0=B if(r0==0) goto loop r1 = 8 r2 = [A + r1]
ARM address dependency
26
[A+8]==B==0
[A+8]=1 store/store B=16
loop: r0=B if(r0==0) goto loop r1 = 8 + r0 r2 = [A + r1]
ARM AD limitation
27
A==B==0A = 1 loop_until(A==1)
B = 16loop: r0=B if(r0==0) goto loop r1 = 8 + r0 r2 = [A + r1]
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