Николай Папирный Тема: "Java memory model для простых смертных"

108
Java Memory Model for mortals Nikolas Papirniy

Transcript of Николай Папирный Тема: "Java memory model для простых смертных"

Page 1: Николай Папирный Тема: "Java memory model для простых смертных"

Java Memory Model

for mortals

Nikolas Papirniy

Page 2: Николай Папирный Тема: "Java memory model для простых смертных"

Java and c++ developers

C++ dev: DEPENDS ON

IMPLEMENTATION!

Java dev: Wait, I didn’t ask a

question

Java dev: May I…...

Page 3: Николай Папирный Тема: "Java memory model для простых смертных"

Why should I spend time on JMM?

Page 4: Николай Папирный Тема: "Java memory model для простых смертных"

Why should I spend time on JMM?

It’s getting asked on job interviews!

Page 5: Николай Папирный Тема: "Java memory model для простых смертных"

Why should I spend time on JMM

Page 6: Николай Папирный Тема: "Java memory model для простых смертных"

Why not everyone knows JMM?

Page 7: Николай Папирный Тема: "Java memory model для простых смертных"

JMM is important!

Page 8: Николай Папирный Тема: "Java memory model для простых смертных"

Today’s goal!

Page 9: Николай Папирный Тема: "Java memory model для простых смертных"

Agenda?

1. Program Order

2. Memory Model

3. Sequential Consistency

4. Synchronization action

5. Synchronization order

6. Synchronezed with

7. Happens-before

8. Double checked locking

Page 10: Николай Папирный Тема: "Java memory model для простых смертных"

Baruch about concurrency

In this case, you can shoot

yourself in any limb of any

caliber!

Page 11: Николай Папирный Тема: "Java memory model для простых смертных"

Is it about Shipilev?

Java Memory Model Pragmatics

Page 12: Николай Папирный Тема: "Java memory model для простых смертных"

There is a little problem

Page 13: Николай Папирный Тема: "Java memory model для простых смертных"

Who visit Shipilev’s presentations?

1) Those who don’t understand Shipilev

2) Those who think they understand Shipilev

3) Shipilev

Page 14: Николай Папирный Тема: "Java memory model для простых смертных"

What was before JMM?

Page 15: Николай Папирный Тема: "Java memory model для простых смертных"

Single threaded

1. int a = 2;

2. int b = 2;

3. int c = a + b

4. System.out.println(c);

Program Order

?

Page 16: Николай Папирный Тема: "Java memory model для простых смертных"

Single threaded

Page 17: Николай Папирный Тема: "Java memory model для простых смертных"

What have we learned?

1. Program order

Page 18: Николай Папирный Тема: "Java memory model для простых смертных"

What about now?

Page 19: Николай Папирный Тема: "Java memory model для простых смертных"

int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

?

Page 20: Николай Папирный Тема: "Java memory model для простых смертных"

int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

A

v = 10;

v = 20;

print v

Page 21: Николай Папирный Тема: "Java memory model для простых смертных"

int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

A

v = 10;

v = 20;

print v

B

v = 20;

v = 10;

print v

Page 22: Николай Папирный Тема: "Java memory model для простых смертных"

int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

A

v = 10;

v = 20;

print v

B

v = 20;

v = 10;

print v

C

v = 20;

print v

v = 10

Page 23: Николай Папирный Тема: "Java memory model для простых смертных"

int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

A

v = 10;

v = 20;

print v

B

v = 20;

v = 10;

print v

C

v = 20;

print v

v = 10

D

print v

v = 20;

v = 10

Page 24: Николай Папирный Тема: "Java memory model для простых смертных"

int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

A

v = 10;

v = 20;

print v

B

v = 20;

v = 10;

print v

C

v = 20;

print v

v = 10

D

print v

v = 20;

v = 10

Page 25: Николай Папирный Тема: "Java memory model для простых смертных"

WAT?

Page 26: Николай Папирный Тема: "Java memory model для простых смертных"

Situation….

1. Compiler

2. Runtime

3. Hardware

Page 27: Николай Папирный Тема: "Java memory model для простых смертных"

Hello memory model!

Page 28: Николай Папирный Тема: "Java memory model для простых смертных"

Memory model QUESTION

What will you see in a certain moment of

program execution?

Page 29: Николай Папирный Тема: "Java memory model для простых смертных"

What is Java Memory Model

Page 30: Николай Папирный Тема: "Java memory model для простых смертных"

int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

A

v = 10;

v = 20;

print v

B

v = 20;

v = 10;

print v

C

v = 20;

print v

v = 10

D

print v

v = 20;

v = 10

Page 31: Николай Папирный Тема: "Java memory model для простых смертных"

What have we learned?

1. Program order

2. Memory model

Page 32: Николай Папирный Тема: "Java memory model для простых смертных"

Sequentially consistent

(Lamport 1979)

1. Executing instructions one at a time

2. Each instruction see result of previos

instructions

3. Total order is consistent with Program Order

Page 33: Николай Папирный Тема: "Java memory model для простых смертных"

Sequentially consistent

1

5

3

4

2

Page 34: Николай Папирный Тема: "Java memory model для простых смертных"

Multi-core heaven?

Page 35: Николай Папирный Тема: "Java memory model для простых смертных"

Caches

Page 36: Николай Папирный Тема: "Java memory model для простых смертных"

Cache line

Cache 1

Cache line

64 bytes

read variable

Page 37: Николай Папирный Тема: "Java memory model для простых смертных"

Cache line

Cache 1

Cache line

Cache line

Page 38: Николай Папирный Тема: "Java memory model для простых смертных"
Page 39: Николай Папирный Тема: "Java memory model для простых смертных"

What have we learned?

1. Program order

2. Memory model

3. Sequential Consistency

Page 40: Николай Папирный Тема: "Java memory model для простых смертных"

SC Reality: concurrency

1

write

1

5

read

4

2

Page 41: Николай Папирный Тема: "Java memory model для простых смертных"

Data race

If:

1. Several threads access one variable

2. One thread writes

3. No synchronization

Page 42: Николай Папирный Тема: "Java memory model для простых смертных"

Data race

Page 43: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Tread 1: read A

Page 44: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Tread 1: read A (cont)

A

Page 45: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Tread 2: read A

A A

Page 46: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thread 1: write A

AA

Page 47: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thread 2: write A

AA

Page 48: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thread 1: memory flushes to main memory

AA

A

Page 49: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thread 2: memory flushes to main memory

AA

AA

Page 50: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Read from local variable

AA

AA

!

Page 51: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization

read

write read

write

Synchronization

read write

Page 52: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization action

➔Read / write volatile

➔Lock / unlock monitor

➔And other

Page 53: Николай Папирный Тема: "Java memory model для простых смертных"

Read / write volatile

volatile int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

SA

Page 54: Николай Папирный Тема: "Java memory model для простых смертных"

Read / write volatile

volatile int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

SA

Page 55: Николай Папирный Тема: "Java memory model для простых смертных"

Read / write volatile

volatile int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

SA

Page 56: Николай Папирный Тема: "Java memory model для простых смертных"

Read / write volatile

volatile int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

SA

Page 57: Николай Папирный Тема: "Java memory model для простых смертных"

Lock / unlock monitor

Object lock = new Object();

Thread 1 Thread 2

1a. synchronized(lock) {

2a. // actions

3a. }

1b. synchronized(lock) {

2b. // actions

3b. }

SA

Page 58: Николай Папирный Тема: "Java memory model для простых смертных"

Lock / unlock monitor

Object lock = new Object();

Thread 1 Thread 2

1a. synchronized(lock) {

2a. // actions

3a. }

1b. synchronized(lock) {

2b. // actions

3b. }

SA

Page 59: Николай Папирный Тема: "Java memory model для простых смертных"

Lock / unlock monitor

Object lock = new Object();

Thread 1 Thread 2

1a. synchronized(lock) {

2a. // actions

3a. }

1b. synchronized(lock) {

2b. // actions

3b. }

SA

Page 60: Николай Папирный Тема: "Java memory model для простых смертных"

Lock / unlock monitor

Object lock = new Object();

Thread 1 Thread 2

1a. synchronized(lock) {

2a. // actions

3a. }

1b. synchronized(lock) {

2b. // actions

3b. }

SA

Page 61: Николай Папирный Тема: "Java memory model для простых смертных"

Lock / unlock monitor

Object lock = new Object();

Thread 1 Thread 2

1a. synchronized(lock) {

2a. // actions

3a. }

1b. synchronized(lock) {

2b. // actions

3b. }

SA

Page 62: Николай Папирный Тема: "Java memory model для простых смертных"

SC Reality: visibility

20

int v = 0;

Thread 1 Thread 2

1a. v = 10; 1b. v = 20;

2b. System.out.println(v);

B

v = 20;

v = 10;

print v

Page 63: Николай Папирный Тема: "Java memory model для простых смертных"

What have we learned?

1. Program order

2. Memory model

3. Sequential Consistency

4. Synchronization action

Page 64: Николай Папирный Тема: "Java memory model для простых смертных"

Visibility of volatile variables

Page 65: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thead 1: read A

read barrier

Page 66: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thead 1: read A (cont)

A

Page 67: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thead 2: read A

A

read barrier

A

Page 68: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thead 1: write A

AA

write barrier

A

Page 69: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thead 2: write A

AA

write barrier

A

Page 70: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thead 2: write A

AA

write barrier

AAA

Page 71: Николай Папирный Тема: "Java memory model для простых смертных"

Thread 1 Thread 2

Shared memoryA

Thead 1: read A

A

A

read barrier

A

A

A

A A

Page 72: Николай Папирный Тема: "Java memory model для простых смертных"

SC Reality: atomicity

long v = 0L;

Thread 1 Thread 2

v = Long.MAX_VALUE; System.out.println(v);

A. Long.MAX_VALUE B. 0L

C. FFFF FFFF 0000 0000 D. 0000 0000 FFFF FFFF

Page 73: Николай Папирный Тема: "Java memory model для простых смертных"

SC Reality: atomicity

long v = 0L;

Thread 1 Thread 2

v = Long.MAX_VALUE; System.out.println(v);

A. Long.MAX_VALUE B. 0L

C. FFFF FFFF 0000 0000 D. 0000 0000 FFFF FFFF

Page 74: Николай Папирный Тема: "Java memory model для простых смертных"

SC Reality: atomicity

Page 75: Николай Папирный Тема: "Java memory model для простых смертных"

Atomicity JMM

A single write to a non-volatile long or double

value is treated as two separate writes: one to

each 32-bit half.

Page 76: Николай Папирный Тема: "Java memory model для простых смертных"

SC Reality: atomicity - SOLUTION

AtomicLong v = new AtomicLong(0L);

Thread 1 Thread 2

l.set(Long.MAX_VALUE); System.out.println(v.get());

A. Long.MAX_VALUE B. 0L

C. FFFF FFFF 0000 0000 D. 0000 0000 FFFF FFFF

Page 77: Николай Папирный Тема: "Java memory model для простых смертных"

SC Reality: atomicity - SOLUTION

AtomicLong v = new AtomicLong(0L);

Thread 1 Thread 2

l.set(Long.MAX_VALUE); System.out.println(v.get());

A. Long.MAX_VALUE B. 0L

C. FFFF FFFF 0000 0000 D. 0000 0000 FFFF FFFF

Page 78: Николай Папирный Тема: "Java memory model для простых смертных"

How?

Page 79: Николай Папирный Тема: "Java memory model для простых смертных"
Page 80: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization order

1

2

44

SA

SA

SA

SA

Thread 1 Thread 2

55

3

3

12

Page 81: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization order

volatile int x, y;

Thread 1 Thread 2

x = 10;

int result1 = y;

y = 20;

int result2 = x;

Page 82: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization order (1)

volatile int x, y;

Thread 1 Thread 2

x = 10;

int result1 = y;

y = 20;

int result2 = x;

Page 83: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization order (2)

volatile int x, y;

Thread 1 Thread 2

x = 10;

int result1 = y;

y = 20;

int result2 = x;

Page 84: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization order (3)

volatile int x, y;

Thread 1 Thread 2

x = 10;

int result1 = y;

y = 20;

int result2 = x;

Page 85: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization order (4)

volatile int x, y;

Thread 1 Thread 2

x = 10;

int result1 = y;

y = 20;

int result2 = x;

?

Page 86: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronization order (4)

volatile int x, y;

Thread 1 Thread 2

x = 10;

int result1 = y;

y = 20;

int result2 = x;

Synchronization order consistent with Program Order

Page 87: Николай Папирный Тема: "Java memory model для простых смертных"

What have we learned?

1. Program order

2. Memory model

3. Sequential Consistency

4. Synchronization action

5. Synchronization order

Page 88: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronizes with

2

1

3

2

1

4 4

3

SA

SA

Thread 1 Thread 2

Page 89: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronizes-with Consistency

● volatile read - can read nearest volatile write

on SO

● monitor unlock - can release nearest monitor

lock on SO

Page 90: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronizes-with

int x;

volatile int y;

Thread 1 Thread 2

x = 10;

int result1 = y;

y = 20;

int result2 = x;

write x: 10

read y: ? read x: ?

write y: 20

Page 91: Николай Папирный Тема: "Java memory model для простых смертных"

Synchronizes-with

int x;

volatile int y;

Thread 1 Thread 2

x = 10;

int result1 = y;

y = 20;

int result2 = x;

write x: 10

read y: ? read x: ?

write y: 20SW

Write y

Read y

SW

Page 92: Николай Папирный Тема: "Java memory model для простых смертных"

What have we learned?

1. Program order

2. Memory model

3. Sequential Consistency

4. Synchronization action

5. Synchronization order

6. Synchronezed with

Page 93: Николай Папирный Тема: "Java memory model для простых смертных"
Page 94: Николай Папирный Тема: "Java memory model для простых смертных"

2

1

3

2

4

1

4

3

SA

SA

Thread 1 Thread 2

5 5

One more thing

Page 95: Николай Папирный Тема: "Java memory model для простых смертных"

One more thing

2

1

3

2

4

1

4

3

SA

SA

Thread 1 Thread 2

5 5

PO

PO

Page 96: Николай Папирный Тема: "Java memory model для простых смертных"

One more thing

2

1

3

2

4

1

4

3

SA

SA

Thread 1 Thread 2

5 5

PO

PO

SW

Page 97: Николай Папирный Тема: "Java memory model для простых смертных"

Happens-before!

2

1

3

2

4

1

4

3

SA

SA

Thread 1 Thread 2

5 5

PO

PO

SW

Page 98: Николай Папирный Тема: "Java memory model для простых смертных"

Happens-before

Program OrderSynchronizati

on Order

Synchronizes

With

Happens-before

Visibility

Page 99: Николай Папирный Тема: "Java memory model для простых смертных"

Happens-before for smarties

HB = {PO & SW}+

Page 100: Николай Папирный Тема: "Java memory model для простых смертных"

What have we learned?

1. Program order

2. Memory model

3. Sequential Consistency

4. Synchronization action

5. Synchronization order

6. Synchronezed with

7. Happens-before

Page 101: Николай Папирный Тема: "Java memory model для простых смертных"

Double checked locking

public static class SingletonFactory{

private Singleton instance;

public Singleton getInstance () {

if ( instance == null ) {

synchronized ( this ) {

if ( instance == null ) {

instance = new Singleton ();

}

}

}

return instance ;

}

}

public static class Singleton {

public Integer x;

public Singleton () { x = 42; }

}

Page 102: Николай Папирный Тема: "Java memory model для простых смертных"

Double checked locking

public static class SingletonFactory{

private Singleton instance;

public Singleton getInstance () {

if ( instance == null ) {

synchronized ( this ) {

if ( instance == null ) {

instance = alloc + Singleton object copy

instance.x = 42

}

}

}

return instance ;

}

}

public static class Singleton {

public Integer x;

public Singleton () { x = 42; }

}

Constructor inline

Page 103: Николай Папирный Тема: "Java memory model для простых смертных"

Double checked locking

public static class SingletonFactory{

private Singleton instance;

public Singleton getInstance () {

if ( instance == null ) {

synchronized ( this ) {

if ( instance == null ) {

instance = new Singleton ();

}

}

}

return instance ;

}

}

public static class Singleton {

public Integer x;

public Singleton () { x = 42; }

}

Returns null

Page 104: Николай Папирный Тема: "Java memory model для простых смертных"
Page 105: Николай Папирный Тема: "Java memory model для простых смертных"

Double checked locking

public static class SingletonFactory{

private Singleton instance;

public Singleton getInstance () {

if ( instance == null ) {

synchronized ( this ) {

if ( instance == null ) {

instance = new Singleton ();

}

}

}

return instance ;

}

}

public static class Singleton {

public Integer x;

public Singleton () { x = 42; }

}

Returns null

Page 106: Николай Папирный Тема: "Java memory model для простых смертных"

Double checked locking solution

public static class SingletonFactory{

private volatile Singleton instance;

public Singleton getInstance () {

if ( instance == null ) {

synchronized ( this ) {

if ( instance == null ) {

instance = new Singleton ();

}

}

}

return instance;

}

}

public static class Singleton {

public Integer x;

public Singleton () { x = 42; }

}

Page 107: Николай Папирный Тема: "Java memory model для простых смертных"

What have we learned?

1. Program order

2. Memory model

3. Sequential Consistency

4. Synchronization action

5. Synchronization order

6. Synchronezed with

7. Happens-before

8. Double checked locking

Page 108: Николай Папирный Тема: "Java memory model для простых смертных"

Reading