Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf ·...

135
Java Memory Model Unlearning Experience or, «Crazy Russian Guy Yells About JMM» Aleksey Shipilёv [email protected] @shipilev

Transcript of Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf ·...

Page 1: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Java Memory Model Unlearning Experienceor, «Crazy Russian Guy Yells About JMM»Aleksey Shipilё[email protected]@shipilev

Page 2: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Safe Harbor / Тихая ГаваньAnything on this or any subsequent slides may be a lie. Donot base your decisions on this talk. If you do, ask forprofessional help.Всё что угодно на этом слайде, как и на всех следующих,может быть враньём. Не принимайте решений наосновании этого доклада. Если всё-таки решите принять,то наймите профессионалов.

Slide 2/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 3: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Theory

Page 4: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Spec: ...vs ImplementationEverybody intuitively understands the difference betweenthe specification and the implementation

class Integer {

/**

* Returns a {@code String} object representing the

* specified integer. The argument is converted to signed decimal

* representation and returned as a string, exactly as if ...

*/

public static String toString(int i) {

// Who cares what is going on here?

}

}Slide 4/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 5: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Spec: Good Spec Is A BalanceUnderspecify, and things become unusable:

/**

* This method can do whatever it pleases.

*/

public void summonNasalDemons(int count) { ... }

Overspecify, and implementation choices are limited:/**

* This method checks if Java program halts.

*/

public boolean checkHalt(String program) { ... }

Slide 5/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 6: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Spec: Abstract MachinesLanguage semantics is specified by the behaviorof the abstract machinepublic int m() {

int x = 42;

int y = 34;

int t = x + y;

return t;

}

m:

...prolog...

mov $76$, %rax

...epilog...

ret

If the result is not distinguishable from the abstract machinebehavior, nobody cares how it was achieved!Slide 6/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 7: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Spec: JMM Is Part Of Abstract MachineIf the result is not distinguishable from the abstract machinebehavior, nobody cares how it was achieved!

volatile int x;

public int m() {

x = 1;

x = 2;

return x;

}

m:

...prolog...

mov $2$, (mem)

mov $2$, %rax

...epilog...

ret

(In practice, not all optimizations are... practical)Slide 7/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 8: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Talk IdeaJMM is simple! (Not joking.)

The problem is educational:Most JMM talks discuss what JMM is about:Works, but piles on naive misconceptionsAlso talks about implementations, blurring the whole thingThis talk discusses what JMM is not about:This is the unlearning experience!(And we try to deconstruct misconceptions)

Slide 8/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 9: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Talk IdeaJMM is simple! (Not joking.)

The problem is educational:Most JMM talks discuss what JMM is about:Works, but piles on naive misconceptionsAlso talks about implementations, blurring the whole thing

This talk discusses what JMM is not about:This is the unlearning experience!(And we try to deconstruct misconceptions)

Slide 8/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 10: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Talk IdeaJMM is simple! (Not joking.)

The problem is educational:Most JMM talks discuss what JMM is about:Works, but piles on naive misconceptionsAlso talks about implementations, blurring the whole thingThis talk discusses what JMM is not about:This is the unlearning experience!(And we try to deconstruct misconceptions)

Slide 8/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 11: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Problem«Oh, give me 5 minutes to read up on JMM!»

Slide 9/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 12: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Actions and Executions

Executions ≈ Actions ∪ Orders ∪ Consistency Rules

Slide 10/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 13: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Actions and Executions

Executions ≈ Actions ∪ Orders ∪ Consistency Rules

Executions are the behaviors of the abstract machine, notthe behavior of final implementation. They define all possibleways the Java program can possibly execute.

Slide 10/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 14: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Actions and ExecutionsExecutions ≈ Actions ∪ Orders ∪ Consistency Rules

Actions:𝑤(𝑓𝑖𝑒𝑙𝑑, 𝑉 ) – write value 𝑉 into 𝑓𝑖𝑒𝑙𝑑𝑟(𝑓𝑖𝑒𝑙𝑑) : 𝑉 – read value 𝑉 from 𝑓𝑖𝑒𝑙𝑑

𝐿(𝑚𝑜𝑛𝑖𝑡𝑜𝑟) – lock the 𝑚𝑜𝑛𝑖𝑡𝑜𝑟

𝑈𝐿(𝑚𝑜𝑛𝑖𝑡𝑜𝑟) – unlock the 𝑚𝑜𝑛𝑖𝑡𝑜𝑟

...Slide 10/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 15: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Actions and ExecutionsExecutions ≈ Actions ∪ Orders ∪ Consistency Rules

Orders:𝑤(𝑎, 1)

hb−−→ 𝑟(𝑎) : 1 ... 𝑤(𝑎, 2)

Consistency rules:PO consistencySO consistency, SO - PO consistencyHB consistency

Slide 10/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 16: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Umm...

Slide 11/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 17: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Why?

OriginalProgram{Executions} {Outcomes}SomeImplementation SomeResults

JMM

Impl

yield

yieldssubset of

Slide 12/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 18: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Why?

OriginalProgram{Executions} {Outcomes}SomeImplementation SomeResults

JMM

Impl

yield

yieldssubset of

Slide 12/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

int a = 0

a = 1 a = 2

r1 = a

Page 19: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Why?

OriginalProgram{Executions} {Outcomes}SomeImplementation SomeResults

JMM

Impl

yield

yieldssubset of

Slide 12/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

int a = 0

a = 1 a = 2

r1 = a

𝑤(𝑎, 1)hb−−→ 𝑟(𝑎) : 1 ... 𝑤(𝑎, 2)

𝑤(𝑎, 1)hb−−→ 𝑟(𝑎) : 2 ... 𝑤(𝑎, 2)

Page 20: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Why?

OriginalProgram{Executions} {Outcomes}SomeImplementation SomeResults

JMM

Impl

yield

yieldssubset of

Slide 12/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

int a = 0

a = 1 a = 2

r1 = a

𝑤(𝑎, 1)hb−−→ 𝑟(𝑎) : 1 ... 𝑤(𝑎, 2)

𝑤(𝑎, 1)hb−−→ 𝑟(𝑎) : 2 ... 𝑤(𝑎, 2)

𝑟1 ∈ {1, 2}

Page 21: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Why?

OriginalProgram{Executions} {Outcomes}SomeImplementation SomeResults

JMM

Impl

yield

yieldssubset of

Slide 12/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

int a = 0

a = 1 a = 2

r1 = a

𝑤(𝑎, 1)hb−−→ 𝑟(𝑎) : 1 ... 𝑤(𝑎, 2)

𝑤(𝑎, 1)hb−−→ 𝑟(𝑎) : 2 ... 𝑤(𝑎, 2)

𝑟1 ∈ {1, 2}

mov 1 → (a)

mov 1 → (r1)

Page 22: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Why?

OriginalProgram{Executions} {Outcomes}SomeImplementation SomeResults

JMM

Impl

yield

yieldssubset of

Slide 12/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

int a = 0

a = 1 a = 2

r1 = a

𝑤(𝑎, 1)hb−−→ 𝑟(𝑎) : 1 ... 𝑤(𝑎, 2)

𝑤(𝑎, 1)hb−−→ 𝑟(𝑎) : 2 ... 𝑤(𝑎, 2)

𝑟1 ∈ {1, 2}

mov 1 → (a)

mov 1 → (r1)𝑟1 ∈ {1}

Page 23: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Takeaway #1: Studying ImplementationsImplementations are allowed togenerate the subset of allowedoutcomes, not all of them

You can study JSR 133Cookbook, but take it with agrain of salt

Reductio ad absurdum:Global Interpreter Lock

Slide 13/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 24: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Takeaway #1: Studying ImplementationsImplementations are allowed togenerate the subset of allowedoutcomes, not all of them

You can study JSR 133Cookbook, but take it with agrain of saltReductio ad absurdum:Global Interpreter Lock

Slide 13/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 25: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: JSR 133 Cookbook For Compiler Writers!...

volatile load

[LoadLoad + LoadStore]

...

...

[StoreStore + LoadStore]

volatile store

[StoreLoad]

...

«Oh wow, so simple!»1. Do not push operations after the volatile store

2. Do not pull operations before the volatile load

3. Do (1), (2) for synchronized enter/exit4. Do not push operations after writing final fields

Slide 14/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 26: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Lock Coarsening with JSR 133 Cookbookvoid m() {

synchronized(this) {

x = 1;

}

synchronized(this) {

y = 1;

}

}

Cookbook−−−−−→

void m() {

[LoadStore] // monitorenter

x = 1;

[StoreStore] // monitorexit

[StoreLoad]

[LoadStore] // monitorenter

y = 1;

[StoreStore] // monitorexit

[StoreLoad]

}

Can we reorder x = 1 and y = 1?JSR 133 Cookbook: Nope, you cannot.Slide 15/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 27: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Lock Coarsening with JMMvoid m() {

synchronized(this) {

x = 1;

}

synchronized(this) {

y = 1;

}

}

coarsening−−−−−→

void m() {

synchronized(this) {

y = 1;

x = 1;

}

}

JSR 133 Cookbook: Nope, you cannot.Java Memory Model: Of course you can.HotSpot: OK, doing it!Slide 16/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 28: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Takeaway #2, Implementation DetailsThese are not mandated by specification,these are implementation details:void barrier() {

synchronized(this) {}; // do barrier!

}

volatile int v;

void barrier() {

v = 1; // do barrier!

}

class MyClass {

volatile int v;

MyClass() {

this.v = 42;

// do barrier!

}

}

Slide 17/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 29: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Takeaway #2, Implementation DetailsThese are not mandated by specification,these are implementation details:void barrier() {

synchronized(this) {}; // do barrier!

}

volatile int v;

void barrier() {

v = 1; // do barrier!

}

class MyClass {

volatile int v;

MyClass() {

this.v = 42;

// do barrier!

}

}

Slide 17/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 30: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Takeaway #2, Implementation DetailsThese are not mandated by specification,these are implementation details:void barrier() {

synchronized(this) {}; // do barrier!

}

volatile int v;

void barrier() {

v = 1; // do barrier!

}

class MyClass {

volatile int v;

MyClass() {

this.v = 42;

// do barrier!

}

}Slide 17/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 31: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Behaviors

Page 32: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Races: Example 1.1class M { ... }

M m;

m = new M(); M lm = m;

m = null; r1 = (lm != null);

r2 = (lm != null);

JMM allows only (𝐹, 𝐹 ) and (𝑇, 𝑇 )

Slide 19/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 33: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Races: Example 1.1class M { ... }

M m;

m = new M(); M lm = m;

m = null; r1 = (lm != null);

r2 = (lm != null);

JMM allows only (𝐹, 𝐹 ) and (𝑇, 𝑇 )

Slide 19/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 34: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Races: Example 1.1, Counter-ArgumentCan’t compiler «inline» the local variable?

class M { ... }

M m;

m = new M();

m = null; r1 = (m != null);

r2 = (m != null);

See, there is an obvious execution that yields (𝑇, 𝐹 ) now!... 𝑟(𝑚) : !𝑛𝑢𝑙𝑙

po−−→ 𝑟(𝑚) : 𝑛𝑢𝑙𝑙

Slide 20/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 35: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Races: Example 1.1, Counter-ArgumentCan’t compiler «inline» the local variable?

class M { ... }

M m;

m = new M();

m = null; r1 = (m != null);

r2 = (m != null);

See, there is an obvious execution that yields (𝑇, 𝐹 ) now!... 𝑟(𝑚) : !𝑛𝑢𝑙𝑙

po−−→ 𝑟(𝑚) : 𝑛𝑢𝑙𝑙

Slide 20/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 36: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Program Order

Program order ( PO ) provides the linkbetween the execution and the program in question

PO – total order for any given thread in isolationPO consistency: PO is consistent with the sourcecode order in the original program

Slide 21/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 37: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: PO And TransformationsOriginal program:

M lm = m;

r1 = (lm != null);

r2 = (lm != null);

𝑤(𝑚, *)po−−→ 𝑤(𝑚,𝑛𝑢𝑙𝑙)

𝑟(𝑚) : *

Transformed program:r1 = (m != null);

r2 = (m != null);

𝑤(𝑚, *)po−−→ 𝑤(𝑚,𝑛𝑢𝑙𝑙)

𝑟(𝑚) : *po−−→ 𝑟(𝑚) : *

Slide 22/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 38: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: PO And TransformationsOriginal program:

M lm = m;

r1 = (lm != null);

r2 = (lm != null);

𝑤(𝑚, *)po−−→ 𝑤(𝑚,𝑛𝑢𝑙𝑙)

𝑟(𝑚) : *

Transformed program:r1 = (m != null);

r2 = (m != null);

𝑤(𝑚, *)po−−→ 𝑤(𝑚,𝑛𝑢𝑙𝑙)

𝑟(𝑚) : *po−−→ 𝑟(𝑚) : *

This execution does not relateto the original program, oops

Slide 22/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 39: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: PO And TransformationsOriginal program:

M lm = m;

r1 = (lm != null);

r2 = (lm != null);

𝑤(𝑚, *)po−−→ 𝑤(𝑚,𝑛𝑢𝑙𝑙)

𝑟(𝑚) : *

Transformed program:r1 = (m != null);

r2 = (m != null);

𝑤(𝑚, *)po−−→ 𝑤(𝑚,𝑛𝑢𝑙𝑙)

𝑟(𝑚) : *po−−→ 𝑟(𝑚) : *

This execution should be usedto reason about outcomesfor the transformed program

Slide 22/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 40: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: PO And TransformationsOriginal program:

M lm = m;

r1 = (lm != null);

r2 = (lm != null);

𝑤(𝑚, *)po−−→ 𝑤(𝑚,𝑛𝑢𝑙𝑙)

𝑟(𝑚) : *

Transformed program:r1 = (m != null);

r2 = (m != null);

𝑤(𝑚, *)po−−→ 𝑤(𝑚,𝑛𝑢𝑙𝑙)

𝑟(𝑚) : *po−−→ 𝑟(𝑚) : *

PO consistency:Original program has single read?Relatable executions also have single read!Slide 22/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 41: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Races: Example 1.2, Null-ChecksIn Java, unlike C/C++:

int s() {

M lm = m;

if (lm != null) {

return lm.x; // <--- This does not risk NPE

else

return 0;

}

This would later become a building blockfor so called «benign» data racesSlide 23/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 42: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Races: Takeaway #31. Data race behavior is still somewhat deterministicRacy reads are stronger than in other languagesWeird stuff still happens, but not completely catastrophic2. Memory-model-wise, there is a difference:

int m1() {

int x1 = field;

int x2 = field;

return x1 + x2;

}

int m2() {

int x1 = field;

int x2 = x1;

return x1 + x2;

}

Slide 24/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 43: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Races: JMM and Ordering Modes

Java 8 Java 9 Definite

Coherence

Causality

Consensus

MutualExcl

– – N

N N N N

plain VH Plain Y

N N N N

– VH Opaque Y

Y N N N

– VH Acq/Rel Y

Y Y N N

volatile VH SeqCst Y

Y Y Y N

locks – Y

Y Y Y Y

Slide 25/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 44: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence

Page 45: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence: Example 2.1int x;

x = 1; r1 = x; // 𝑟1r2 = x; // 𝑟2

JMM allows observing (1, 0), see:𝑤(𝑥, 1) ... 𝑟1(𝑥) : 1

po−−→ 𝑟2(𝑥) : 0

This execution is PO consistent, both reads are here!

Slide 27/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 46: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence: Example 2.1int x;

x = 1; r1 = x; // 𝑟1r2 = x; // 𝑟2

JMM allows observing (1, 0), see:𝑤(𝑥, 1) ... 𝑟1(𝑥) : 1

po−−→ 𝑟2(𝑥) : 0

This execution is PO consistent, both reads are here!

Slide 27/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 47: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence: Example 2.1int x;

x = 1; r1 = x; // 𝑟1r2 = x; // 𝑟2

JMM allows observing (1, 0), see:𝑤(𝑥, 1) ... 𝑟1(𝑥) : 1

po−−→ 𝑟2(𝑥) : 0

This execution is PO consistent, both reads are here!Slide 27/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 48: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence: DefinitionCoherence (def.) :The writes to the single memory locationappear to be in a total orderconsistent with program order

Most hardware gives this for freeMost optimizers give up on this by default (i.e. donot track the order of reads)

Slide 28/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 49: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Consistency RulesPO consistency affects the structure of the execution.What we need: a consistency rule that affects valuesobserved by the actions.

In JMM, there are two of them:1. Happens-before ( HB ) consistency2. Synchronization order ( SO ) consistency

Slide 29/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 50: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: Consistency RulesPO consistency affects the structure of the execution.What we need: a consistency rule that affects valuesobserved by the actions.

In JMM, there are two of them:1. Happens-before ( HB ) consistency2. Synchronization order ( SO ) consistency← now!

Slide 29/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 51: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: SO – Synchronization OrderSO covers all synchronization actions :volatile read/write, lock/unlock, etc.

SO is a total order («All SA actions relate to each other»)SO - PO consistency: so

−−→ and po−−→ agree

SO consistency: reads see only the latest write in so−−→

Slide 30/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 52: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

JMM: SO – Synchronization OrderSO covers all synchronization actions :volatile read/write, lock/unlock, etc.

SO is a total order («All SA actions relate to each other»)SO - PO consistency: so

−−→ and po−−→ agree

SO consistency: reads see only the latest write in so−−→

Just what coherence wants!Slide 30/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 53: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence: Example 2.2

volatile int x;

x = 1; r1 = x; // 𝑟1r2 = x; // 𝑟2

Slide 31/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 54: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence: Example 2.2volatile int x;

x = 1; r1 = x; // 𝑟1r2 = x; // 𝑟2

Valid executions give (0, 0), (1, 1), (0, 1):a𝑤(𝑥, 1)

so−−→ 𝑟1(𝑥) : 1

so−−→ 𝑟2(𝑥) : 1

𝑟1(𝑥) : 0so−−→ 𝑤(𝑥, 1)

so−−→ 𝑟2(𝑥) : 1

𝑟1(𝑥) : 0so−−→ 𝑟2(𝑥) : 0

so−−→ 𝑤(𝑥, 1)

aProving no other outcomes exist is left as an exercise for the readerSlide 31/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 55: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence: Takeaway #41. Races laugh at our presuppositions about orderMost of the time, there is a complete free-for-allMadness usually manifests after code transformationsAlthough hardware can also get us down2. Coherency, while basic, is not guaranteed, unless...We use volatile that is naturally coherentWe use weaker forms of VarHandles that are coherentWe use properly synchronized (non-racy) reads

Slide 32/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 56: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Coherence: JMM and Ordering Modes

Java 8 Java 9 Definite

Coherence

Causality

Consensus

MutualExcl

– – N N

N N N

plain VH Plain Y N

N N N

– VH Opaque Y Y

N N N

– VH Acq/Rel Y Y

Y N N

volatile VH SeqCst Y Y

Y Y N

locks – Y Y

Y Y Y

Slide 33/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 57: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality

Page 58: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: SW – Synchronizes-With Order

When one SA «sees» the value of another SA,they are said to be in «synchronizes-with» ( SW ) relation

SW is a partial orderSW connects the operations that «see» each otherActs like the «bridge» between the threads

Slide 35/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 59: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: HB – Happens-Before OrderHB is a transitive closureover the union of PO and SW

HB is a partial order(Translation: not everything is connected)HB consistency: reads observe either:the last write in hb

−−→, orany other write, not ordered by hb

−−→Slide 36/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 60: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Example 3.1

int x;

volatile int y;

x = 1; r1 = y;

y = 1; r2 = x;

Slide 37/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 61: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Example 3.1int x;

volatile int y;

x = 1; r1 = y;

y = 1; r2 = x;

We are dealing with this class of executions:𝑤(𝑥, 1)

po−−→ 𝑤(𝑦, 1) ... 𝑟(𝑦) : *

po−−→ 𝑟(𝑥) : *

Slide 37/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 62: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Example 3.1int x;

volatile int y;

x = 1; r1 = y;

y = 1; r2 = x;

Racy subclass:𝑤(𝑥, 1)

hb−−→ 𝑤(𝑦, 1) ... 𝑟(𝑦) : 0

hb−−→ 𝑟(𝑥) : 0

𝑤(𝑥, 1)hb−−→ 𝑤(𝑦, 1) ... 𝑟(𝑦) : 0

hb−−→ 𝑟(𝑥) : 1

Slide 37/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 63: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Example 3.1int x;

volatile int y;

x = 1; r1 = y;

y = 1; r2 = x;

Non-racy subclass:𝑤(𝑥, 1)

hb−−→ 𝑤(𝑦, 1)

hb−−→ 𝑟(𝑦) : 1

hb−−→ 𝑟(𝑥) : 1

𝑤(𝑥, 1)hb−−→ 𝑤(𝑦, 1)

hb−−→ 𝑟(𝑦) : 1

hb−−→ 𝑟(𝑥) : 0

Slide 37/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 64: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Look Closer, #1

Happens-before is defined over actions,not over statements: notice no HB between volatile ops!𝑤(𝑥, 1)

hb−−→ 𝑤(𝑦, 1) ... 𝑟(𝑦) : 0

hb−−→ 𝑟(𝑥) : 0

not required to see thisSlide 38/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 65: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Look Closer, #2This violates HB consistency:

𝑤(𝑥, 1)hb−−→ 𝑤(𝑦, 1)

hb−−→ 𝑟(𝑦) : 1

hb−−→ 𝑟(𝑥) : 0

Causality: Observing the volatile store causes observingeverything stored before itshould have seen this!

Slide 39/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 66: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Example 3.2int x;

volatile int y;

y = 1; r1 = x;

x = 1; r2 = y;

Notice the orderis different

Hey, look how (1, 0) is allowed:𝑤(𝑦, 1)

hb−−→ 𝑤(𝑥, 1) ... 𝑟(𝑥) : 1

hb−−→ 𝑟(𝑦) : 0

Look: irrelevant that y is volatile!

Slide 40/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 67: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Example 3.2int x;

volatile int y;

y = 1; r1 = x;

x = 1; r2 = y;

Notice the orderis different

Hey, look how (1, 0) is allowed:𝑤(𝑦, 1)

hb−−→ 𝑤(𝑥, 1) ... 𝑟(𝑥) : 1

hb−−→ 𝑟(𝑦) : 0

Look: irrelevant that y is volatile!

Slide 40/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 68: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Example 3.2int x;

volatile int y;

y = 1; r1 = x;

x = 1; r2 = y;

Notice the orderis different

Hey, look how (1, 0) is allowed:𝑤(𝑦, 1)

hb−−→ 𝑤(𝑥, 1) ... 𝑟(𝑥) : 1

hb−−→ 𝑟(𝑦) : 0

Look: irrelevant that y is volatile!Slide 40/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 69: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Safe Publicationvolatile int v;

x = ...;

y = ...;

z = ...;

v = 1; 𝑟𝑒𝑙𝑒𝑎𝑠𝑒

𝑎𝑐𝑞𝑢𝑖𝑟𝑒 if (v == 1) {

int lx = x;

int ly = y;

int lz = z;

}

send

As if «commits to memory», but only for acq/rel pairrelease «commits», acquire gets the committedacquire has to see release witness!

Slide 41/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 70: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: Takeaway #51. Safe publication is the major (and simple) ruleIdentify your acquires and releasesCheck that acquires/releases are on all pathsLearn this rule! Then learn it again!2. The whole thing does not require JMM reasoningHardly anyone applies «happens-before» correctlyHardly anyone can do it reliablyIt is very easy to miss the racy access

Slide 42/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 71: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Causality: JMM and Ordering Modes

Java 8 Java 9 Definite

Coherence

Causality

Consensus

MutualExcl

– – N N N

N N

plain VH Plain Y N N

N N

– VH Opaque Y Y N

N N

– VH Acq/Rel Y Y Y

N N

volatile VH SeqCst Y Y Y

Y N

locks – Y Y Y

Y Y

Slide 43/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 72: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Consensus

Page 73: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Consensus: Example 4.1volatile int x, y;

x = 1; y = 1; int r1 = y; int r3 = x;

int r2 = x; int r4 = y;

HB alone allows seeing (1, 0, 1, 0):𝑤(𝑦, 1)

hb−−→ 𝑟1(𝑦) : 1

hb−−→ 𝑟3(𝑥) : 0

𝑤(𝑥, 1)hb−−→ 𝑟2(𝑥) : 1

hb−−→ 𝑟4(𝑦) : 0

Slide 45/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 74: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Consensus: SCSequential Consistency (SC): (def.)«...the result of any execution is the same as if theoperations of all the processors were executedin some sequential order, and the operations ofeach individual processor appear in this sequencein the order specified by its program»

Slide 46/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 75: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Consensus: SO – Synchronization OrderSO covers all synchronization actions :volatile read/write, lock/unlock, etc.

SO is a total order («All SA actions relate to each other»)SO - PO consistency: so

−−→ and po−−→ agree

SO consistency: reads see only the latest write in so−−→

Just what Sequential Consistency wants!Slide 47/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 76: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Consensus: Takeaway #6

1. SO ≈ Sequential ConsistencyWant SC? You have to go full-blown volatileSeed enough volatiles around your program, and iteventually becomes data-race-free! /s2. Sequential Consistency is not always neededExtreme costs to get it in distributed systemsMost examples so far were fine with just Release/Acquire!

Slide 48/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 77: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Consensus: JMM and Ordering Modes

Java 8 Java 9 Definite

Coherence

Causality

Consensus

MutualExcl

– – N N N N

N

plain VH Plain Y N N N

N

– VH Opaque Y Y N N

N

– VH Acq/Rel Y Y Y N

N

volatile VH SeqCst Y Y Y Y

N

locks – Y Y Y Y

Y

Slide 49/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 78: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Example 5.1class M { final int x = 42; }

M m;

m = new M() M lm = m

if (lm != null)

r1 = lm.x

else

r1 = 1

Slide 50/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 79: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Example 5.1class M { final int x = 42; }

M m;

m = new M() M lm = m

if (lm != null)

r1 = lm.x

else

r1 = 1

JMM guarantees seeing the value of final field here:𝑟1 ∈ {1, 42}

Slide 50/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 80: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Example 5.1class M { final int x = 42; }

M m;

m = new M() M lm = m

if (lm != null)

r1 = lm.x

else

r1 = 1

Special rule, if x is a final field:𝑤(𝑥, 42)

hb−−→ 𝑟(𝑥) : 42

Slide 50/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 81: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Example 5.2class M { 𝑣𝑜𝑙𝑎𝑡𝑖𝑙𝑒 int x = 42; }

M m;

m = new M() M lm = m

if (lm != null)

r1 = lm.x

else

r1 = 1

Slide 51/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 82: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Example 5.2class M { 𝑣𝑜𝑙𝑎𝑡𝑖𝑙𝑒 int x = 42; }

M m;

m = new M() M lm = m

if (lm != null)

r1 = lm.x

else

r1 = 1

JMM allows (0) here:𝑤(𝑐𝑚.𝑥, 42)

hb−−→ 𝑤(𝑐𝑚,𝑚) ... 𝑟(𝑚) : 𝑙𝑚

hb−−→ 𝑟(𝑙𝑚.𝑥) : 0

Slide 51/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 83: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Example 5.2class M { 𝑣𝑜𝑙𝑎𝑡𝑖𝑙𝑒 int x = 42; }

M m;

m = new M() M lm = m

if (lm != null)

r1 = lm.x

else

r1 = 1

volatile /∈ final

final /∈ volatile

Slide 51/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 84: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Safe ConstructionSpecial rule for final fields:𝑤𝑟𝑖𝑡𝑒𝑠𝑓𝑖𝑛𝑎𝑙

hb−−→ 𝑟𝑒𝑎𝑑𝑠𝑓𝑖𝑛𝑎𝑙

The derivation for that rule is complicated.Two absolutely necessary things:

Field is finalConstructor does not publish this

Slide 52/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 85: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Benign RacesV v; // deliberately non-volatile

public V racyRacy() {

V lv = v; // RULE 1: Read it once (racily)

if (lv == null) { // RULE 2: Check it is fine

v = compute(); // RULE 3: Recover by safely constructing

}

return lv;

}

Forgo one of the rules, and you get the non-benign race.Slide 53/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 86: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Benign Races, Real Examplepublic class AbstractMap<K, V> {

transient Set<K> keySet; // non-volatile

public Set<K> keySet() {

Set<K> ks = keySet; // RULE 1: Read it once (racily)

if (ks == null) { // RULE 2: Check it’s fine

ks = new KeySet(); // RULE 3: Recover by safely constructing

keySet = ks;

}

return ks;

}

}

Slide 54/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 87: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Finals: Takeaway #71. Safe construction is another major (and simple) ruleUse it to protect against inadvertent races!When it doubt, make all fields final2. Benign races are seldom usefulAllow avoiding synchronized ops on critical pathsWork only if three rules are followed: single (racy) read,reliability check, recovery path that safely constructs

Slide 55/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 88: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Locks

Page 89: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Locks: JMM and Ordering Modes

Java 8 Java 9 Definite

Coherence

Causality

Consensus

MutualExcl

– – N N N N N

plain VH Plain Y N N N N

– VH Opaque Y Y N N N

– VH Acq/Rel Y Y Y N N

volatile VH SeqCst Y Y Y Y N

locks – Y Y Y Y Y

Slide 57/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 90: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Summing Up

Page 91: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Summing Up: Rule #1: Safe PublicationGolden Rule:Thread 1: store everything, then releaseThread 2: acquire, then read anything

Automatically happens when publishing viawell-designed concurrency primitivesHas to happen on all possible execution pathsHas to happen in correct order

Slide 59/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 92: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Summing Up: Rule #2: Safe ConstructionGolden Rule:When in doubt, make all fields final.

Makes the whole thing more resilient to racesThink «defense in depth»: survive in case some path failsto publish the instance safely

Slide 60/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 93: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Summing Up: Rule #3: Benign Races

Golden Rule:Object is safely constructed, and there is single read.Exotic optimization technique, rarely neededThe (only) easy way to avoid synchronization

Slide 61/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 94: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Summing Up: Rule #4: Exotic ModesGolden Rule:Don’t.

Just don’t!There are cases where performance is so important, youwant to have weaker than volatile, but stronger thanplain – VarHandles to rescue!

Slide 62/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 95: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Practice

Page 96: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Practice: Double-Checked Lockingvolatile T val;

public T get() {

if ( 1 val == null) {

synchronized (this) {

if ( 2 val == null) {

3 val = new T();

}

}

}

return 4 val;

}

Slide 64/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 97: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Practice: Double-Checked Lockingvolatile T val;

public T get() {

if ( 1 val == null) {

synchronized (this) {

if ( 2 val == null) {

3 val = new T();

}

}

}

return 4 val;

}

Holy Macaroni, it does notwork without volatile!But why do you need it?

Slide 64/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 98: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Practice: Double-Checked Lockingvolatile T val;

public T get() {

if ( 1 val == null) {

synchronized (this) {

if ( 2 val == null) {

3 val = new T();

}

}

}

return 4 val;

}

What ordering modes arenecessary at 1, 2, 3, 4?

Release/acquire: 3→ 1Coherence: 1→ 4

Slide 64/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 99: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Practice: Double-Checked Lockingvolatile T val;

public T get() {

if ( 1 val == null) {

synchronized (this) {

if ( 2 val == null) {

3 val = new T();

}

}

}

return 4 val;

}

What ordering modes arenecessary at 1, 2, 3, 4?Release/acquire: 3→ 1

Coherence: 1→ 4

Slide 64/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 100: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Practice: Double-Checked Lockingvolatile T val;

public T get() {

if ( 1 val == null) {

synchronized (this) {

if ( 2 val == null) {

3 val = new T();

}

}

}

return 4 val;

}

What ordering modes arenecessary at 1, 2, 3, 4?Release/acquire: 3→ 1Coherence: 1→ 4

Slide 64/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 101: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Practice: DCL with VarHandlesstatic final VH = ...;

V val; // not volatile, specify at use-site

public V get() {

if (VH.getAcquire(this) == null) {

synchronized (this) {

if (VH.get(this) == null) {

VH.setRelease(this, new T());

}

}

}

return VH.get(this);

}

Slide 65/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 102: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: The Purest Formpublic class Lazy<V> {

final Supplier<V> s;

V v;

public Lazy(Supplier<V> s) {

this.s = s;

}

public synchronized V get() {

if (v == null) {

v = s.get();

}

return v;

}

}

Lazy instantiator:obviously correct, right?

Let us optimize it a little.First, let’s apply DCL...

Slide 66/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 103: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: The Purest Formpublic class Lazy<V> {

final Supplier<V> s;

V v;

public Lazy(Supplier<V> s) {

this.s = s;

}

public synchronized V get() {

if (v == null) {

v = s.get();

}

return v;

}

}

Lazy instantiator:obviously correct, right?

Let us optimize it a little.

First, let’s apply DCL...

Slide 66/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 104: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: The Purest Formpublic class Lazy<V> {

final Supplier<V> s;

V v;

public Lazy(Supplier<V> s) {

this.s = s;

}

public synchronized V get() {

if (v == null) {

v = s.get();

}

return v;

}

}

Lazy instantiator:obviously correct, right?

Let us optimize it a little.First, let’s apply DCL...

Slide 66/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 105: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #1final Supplier<V> s;

volatile V v;

public V get() {

if (v == null) {

synchronized (this) {

if (v == null) {

v = s.get();

}

}

}

return v;

}

Still works?

It does!Let us polish it a bit:1. Supplier is not reallyneeded after first andonly use2. What if Supplierreturns null?

Slide 67/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 106: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #1final Supplier<V> s;

volatile V v;

public V get() {

if (v == null) {

synchronized (this) {

if (v == null) {

v = s.get();

}

}

}

return v;

}

Still works? It does!

Let us polish it a bit:1. Supplier is not reallyneeded after first andonly use2. What if Supplierreturns null?

Slide 67/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 107: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #1final Supplier<V> s;

volatile V v;

public V get() {

if (v == null) {

synchronized (this) {

if (v == null) {

v = s.get();

}

}

}

return v;

}

Still works? It does!Let us polish it a bit:1. Supplier is not reallyneeded after first andonly use2. What if Supplierreturns null?

Slide 67/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 108: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #2[what?] V v;

[what?] Supplier<V> s;

public V get() {

if (s != null) {

synchronized (this) {

if (s != null) {

v = s.get();

s = null;

}

}

}

return v;

}

Ummm... Where to putvolatile now?

A. To field vB. To field sC. To both v and sD. 50:50E. Phone A Friend

Slide 68/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 109: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #2, Try 1volatile V v;

Supplier<V> s;

public T get() {

if ( s != null) {

synchronized (this) {

if (s != null) {

v = s.get();

s = null;

}

}

}

return v;

}

Let us put volatile to v.Any problems?

Oops, release/acquire ismisplaced! Racy read of spotentially exposes𝑟(𝑣) : 𝑛𝑢𝑙𝑙

Slide 69/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 110: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #2, Try 1volatile V v;

Supplier<V> s;

public T get() {

if ( s != null) {

synchronized (this) {

if (s != null) {

v = s.get();

s = null;

}

}

}

return v;

}

Let us put volatile to v.Any problems?

Oops, release/acquire ismisplaced! Racy read of spotentially exposes𝑟(𝑣) : 𝑛𝑢𝑙𝑙

Slide 69/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 111: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Example 3.2int x;

volatile int y;

y = 1; r1 = x;

x = 1; r2 = y;

Notice the orderis different

Hey, look how (1, 0) is allowed:𝑤(𝑦, 1)

hb−−→ 𝑤(𝑥, 1) ... 𝑟(𝑥) : 1

hb−−→ 𝑟(𝑦) : 0

Look: irrelevant that y is volatile!Slide 70/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 112: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #2, Try 2V v;

volatile Supplier<V> s;

public T get() {

if ( s != null) {

synchronized (this) {

if (s != null) {

v = s.get();

s = null;

}

}

}

return v;

}

Let us put volatile to s.Any problems?

No problem, ourrelease/acquire witnessgets us the proper v.Optimizing further? Wedon’t really like the

volatile read!

Slide 71/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 113: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #2, Try 2V v;

volatile Supplier<V> s;

public T get() {

if ( s != null) {

synchronized (this) {

if (s != null) {

v = s.get();

s = null;

}

}

}

return v;

}

Let us put volatile to s.Any problems?No problem, ourrelease/acquire witnessgets us the proper v.

Optimizing further? Wedon’t really like thevolatile read!

Slide 71/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 114: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #2, Try 2V v;

volatile Supplier<V> s;

public T get() {

if ( s != null) {

synchronized (this) {

if (s != null) {

v = s.get();

s = null;

}

}

}

return v;

}

Let us put volatile to s.Any problems?No problem, ourrelease/acquire witnessgets us the proper v.

Optimizing further? Wedon’t really like thevolatile read!

Slide 71/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 115: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #3, Try 1V v;

volatile Supplier<V> s;

public V get() {

if ( v == null && s != null) {

synchronized (this) {

if (s != null) {

v = s.get();

s = null;

}

}

}

return v;

}

Non-volatile fast-path,nice! Any problems?

Oops: no coherencebetween reads

Slide 72/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 116: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #3, Try 1V v;

volatile Supplier<V> s;

public V get() {

if ( v == null && s != null) {

synchronized (this) {

if (s != null) {

v = s.get();

s = null;

}

}

}

return v;

}

Non-volatile fast-path,nice! Any problems?

Oops: no coherencebetween reads

Slide 72/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 117: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Example 2.1int x;

x = 1; r1 = x; // 𝑟1r2 = x; // 𝑟2

JMM allows observing (1, 0), see:𝑤(𝑥, 1) ... 𝑟1(𝑥) : 1

po−−→ 𝑟2(𝑥) : 0

This execution is PO consistent, both reads are here!Slide 73/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 118: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #3, Try 2V v;

volatile Supplier<V> s;

public V get() {

V lv = v;

if (lv == null && s != null) {

synchronized (this) {

if (s != null) {

v = lv = s.get();

s = null;

}

}

}

return lv;

}

Fixing up coherency withsingle read. Any problemsleft?

No release/acquire on thispath, oops.

Slide 74/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 119: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Lazy<V>: Optimized #3, Try 2V v;

volatile Supplier<V> s;

public V get() {

V lv = v;

if (lv == null && s != null) {

synchronized (this) {

if (s != null) {

v = lv = s.get();

s = null;

}

}

}

return lv;

}

Fixing up coherency withsingle read. Any problemsleft?

No release/acquire on thispath, oops.

Slide 74/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 120: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Conclusions

Page 121: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Conclusions: In One Picture

Slide 76/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 122: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Conclusions: In Four Paragraphs1. Safe publication and safe construction cover 99.99%of real concurrency cases!2. Benign races cover another 0.00999% of performanceoptimization cases3. All other fantasies on «what optimizers do», «whathardware does» – please keep them out4. Want more? Study JMM rules!

Slide 77/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 123: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Conclusions: In 280 Symbols

Slide 78/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 124: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Conclusions: Further ReadingIn ascending order of difficulty:1. «Safe Publication and Safe Initialization in Java»:

https://shipilev.net/blog/2014/safe-public-construction/

2. «Java Memory Model Pragmatics»:https://shipilev.net/blog/2014/jmm-pragmatics/

3. «Close Encounters of JMM Kind»:https:

//shipilev.net/blog/2016/close-encounters-of-jmm-kind/

4. «Using JDK 9 Memory Order Modes»:http://gee.cs.oswego.edu/dl/html/j9mm.html

Slide 79/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 125: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup

Page 126: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: Global Memory Illusion«Reordering» makes sense when there isan illusion of global synchronized memory.

volatile int x, y;

x = 1; y = 1; int r1 = y; int r3 = x;

int r2 = x; int r4 = y;

If we stick the barriers around the operations,everything is fine, right?Slide 81/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 127: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: IRIWvolatile int x, y;

x = 1; y = 1; int r1 = y; int r3 = x;

int r2 = x; int r4 = y;

(𝑟1, 𝑟2, 𝑟3, 𝑟4) = (1, 0, 1, 0) is forbidden by JMM:volatile ops are sequentially consistent.

Slide 82/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 128: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: IRIW With Barriersvolatile int x, y;

<fullFence> <fullFence> <loadFence> <loadFence>

x = 1; y = 1; int r1 = y; int r3 = x;

<fullFence> <fullFence> <loadFence> <loadFence>

int r2 = x; int r4 = y;

<loadFence> <loadFence>

PowerPC: LOL, nice try, but(𝑟1, 𝑟2, 𝑟3, 𝑟4) = (1, 0, 1, 0)

Slide 83/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 129: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: IRIW With Barriersvolatile int x, y;

<fullFence> <fullFence> <loadFence> <loadFence>

x = 1; y = 1; int r1 = y; int r3 = x;

<fullFence> <fullFence> <loadFence> <loadFence>

int r2 = x; int r4 = y;

<loadFence> <loadFence>

PowerPC: LOL, nice try, but(𝑟1, 𝑟2, 𝑟3, 𝑟4) = (1, 0, 1, 0)

Slide 83/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 130: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: Consensus, Example 4.2synchronized(m) {

x = 1;

y = 1;

}

synchronized(m) {

x = 2;

y = 2;

}

synchronized(m) {

r1 = x;

r2 = y;

}

If we only have HB , (1, 2) is possible:𝑤(𝑥, 1)

hb−−→ 𝑤(𝑦, 1)

hb−−→ 𝑈𝐿(𝑚)

𝐿(𝑚)hb−−→ 𝑟(𝑥) :?

hb−−→ 𝑟(𝑦) :?

𝑤(𝑥, 2)hb−−→ 𝑤(𝑦, 2)

hb−−→ 𝑈𝐿(𝑚)

Slide 84/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 131: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: Consensus, Example 4.2synchronized(m) {

x = 1;

y = 1;

}

synchronized(m) {

x = 2;

y = 2;

}

synchronized(m) {

r1 = x;

r2 = y;

}

If we only have HB , (1, 2) is possible:𝑤(𝑥, 1)

hb−−→ 𝑤(𝑦, 1)

hb−−→ 𝑈𝐿(𝑚)

𝐿(𝑚)hb−−→ 𝑟(𝑥) :?

hb−−→ 𝑟(𝑦) :?

𝑤(𝑥, 2)hb−−→ 𝑤(𝑦, 2)

hb−−→ 𝑈𝐿(𝑚)

Slide 84/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 132: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: Optimized #4, Try 1V v;

Supplier<V> s;

public V get() {

V lv = v;

if (lv == null && s != null) {

synchronized (this) {

if (s != null) {

v = lv = s.get();

s = null;

}

}

}

return lv;

}

What if we rely on V beingsafely constructed? Thatwould allow us to dropvolatile here, right?

No! Here is where it goesdownhill returning null:𝑤(𝑣, 𝑉 )

hb−−→ 𝑤(𝑠, 𝑛𝑢𝑙𝑙)

𝑟(𝑣) : 𝑛𝑢𝑙𝑙hb−−→ 𝑟(𝑠) : 𝑛𝑢𝑙𝑙

Slide 85/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 133: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: Optimized #4, Try 1V v;

Supplier<V> s;

public V get() {

V lv = v;

if (lv == null && s != null) {

synchronized (this) {

if (s != null) {

v = lv = s.get();

s = null;

}

}

}

return lv;

}

What if we rely on V beingsafely constructed? Thatwould allow us to dropvolatile here, right?

No! Here is where it goesdownhill returning null:𝑤(𝑣, 𝑉 )

hb−−→ 𝑤(𝑠, 𝑛𝑢𝑙𝑙)

𝑟(𝑣) : 𝑛𝑢𝑙𝑙hb−−→ 𝑟(𝑠) : 𝑛𝑢𝑙𝑙

Slide 85/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 134: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: Optimized #4, Try 2V v;

Supplier<V> s;

public V get() {

V lv = v;

if (lv == null) {

synchronized (this) {

if (s != null) {

v = lv = s.get();

s = null;

}

}

}

return lv;

}

What if we rely on V beingsafely constructed? Thatwould allow us to dropvolatile here, right?

Now it is fine, follows thebenign race pattern.

Slide 86/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’

Page 135: Java Memory Model Unlearning Experience - or, «Crazy ... › talks › geecon-May2018-jmm.pdf · SafeHarbor/Тихая Гавань Anythingonthisoranysubsequentslidesmaybealie.Do

Backup: Optimized #4, Try 2V v;

Supplier<V> s;

public V get() {

V lv = v;

if (lv == null) {

synchronized (this) {

if (s != null) {

v = lv = s.get();

s = null;

}

}

}

return lv;

}

What if we rely on V beingsafely constructed? Thatwould allow us to dropvolatile here, right?

Now it is fine, follows thebenign race pattern.Slide 86/86. «Java Memory Model Unlearning Experience», Aleksey Shipilёv, 2018, D:20180511133537+02’00’