![Page 1: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/1.jpg)
Java Memory Model
for mortals
Nikolas Papirniy
![Page 2: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/2.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/3.jpg)
Why should I spend time on JMM?
![Page 4: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/4.jpg)
Why should I spend time on JMM?
It’s getting asked on job interviews!
![Page 5: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/5.jpg)
Why should I spend time on JMM
![Page 6: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/6.jpg)
Why not everyone knows JMM?
![Page 7: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/7.jpg)
JMM is important!
![Page 8: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/8.jpg)
Today’s goal!
![Page 9: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/9.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/10.jpg)
Baruch about concurrency
In this case, you can shoot
yourself in any limb of any
caliber!
![Page 11: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/11.jpg)
Is it about Shipilev?
Java Memory Model Pragmatics
![Page 12: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/12.jpg)
There is a little problem
![Page 13: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/13.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/14.jpg)
What was before JMM?
![Page 15: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/15.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/16.jpg)
Single threaded
![Page 17: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/17.jpg)
What have we learned?
1. Program order
![Page 18: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/18.jpg)
What about now?
![Page 19: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/19.jpg)
int v = 0;
Thread 1 Thread 2
1a. v = 10; 1b. v = 20;
2b. System.out.println(v);
?
![Page 20: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/20.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/21.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/22.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/23.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/24.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/25.jpg)
WAT?
![Page 26: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/26.jpg)
Situation….
1. Compiler
2. Runtime
3. Hardware
![Page 27: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/27.jpg)
Hello memory model!
![Page 28: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/28.jpg)
Memory model QUESTION
What will you see in a certain moment of
program execution?
![Page 29: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/29.jpg)
What is Java Memory Model
![Page 30: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/30.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/31.jpg)
What have we learned?
1. Program order
2. Memory model
![Page 32: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/32.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/33.jpg)
Sequentially consistent
1
5
3
4
2
![Page 34: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/34.jpg)
Multi-core heaven?
![Page 35: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/35.jpg)
Caches
![Page 36: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/36.jpg)
Cache line
Cache 1
Cache line
64 bytes
read variable
![Page 37: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/37.jpg)
Cache line
Cache 1
Cache line
Cache line
![Page 38: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/38.jpg)
![Page 39: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/39.jpg)
What have we learned?
1. Program order
2. Memory model
3. Sequential Consistency
![Page 40: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/40.jpg)
SC Reality: concurrency
1
write
1
5
read
4
2
![Page 41: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/41.jpg)
Data race
If:
1. Several threads access one variable
2. One thread writes
3. No synchronization
![Page 42: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/42.jpg)
Data race
![Page 43: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/43.jpg)
Thread 1 Thread 2
Shared memoryA
Tread 1: read A
![Page 44: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/44.jpg)
Thread 1 Thread 2
Shared memoryA
Tread 1: read A (cont)
A
![Page 45: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/45.jpg)
Thread 1 Thread 2
Shared memoryA
Tread 2: read A
A A
![Page 46: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/46.jpg)
Thread 1 Thread 2
Shared memoryA
Thread 1: write A
AA
![Page 47: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/47.jpg)
Thread 1 Thread 2
Shared memoryA
Thread 2: write A
AA
![Page 48: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/48.jpg)
Thread 1 Thread 2
Shared memoryA
Thread 1: memory flushes to main memory
AA
A
![Page 49: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/49.jpg)
Thread 1 Thread 2
Shared memoryA
Thread 2: memory flushes to main memory
AA
AA
![Page 50: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/50.jpg)
Thread 1 Thread 2
Shared memoryA
Read from local variable
AA
AA
!
![Page 51: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/51.jpg)
Synchronization
read
write read
write
Synchronization
read write
![Page 52: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/52.jpg)
Synchronization action
➔Read / write volatile
➔Lock / unlock monitor
➔And other
![Page 53: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/53.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/54.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/55.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/56.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/57.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/58.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/59.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/60.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/61.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/62.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/63.jpg)
What have we learned?
1. Program order
2. Memory model
3. Sequential Consistency
4. Synchronization action
![Page 64: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/64.jpg)
Visibility of volatile variables
![Page 65: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/65.jpg)
Thread 1 Thread 2
Shared memoryA
Thead 1: read A
read barrier
![Page 66: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/66.jpg)
Thread 1 Thread 2
Shared memoryA
Thead 1: read A (cont)
A
![Page 67: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/67.jpg)
Thread 1 Thread 2
Shared memoryA
Thead 2: read A
A
read barrier
A
![Page 68: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/68.jpg)
Thread 1 Thread 2
Shared memoryA
Thead 1: write A
AA
write barrier
A
![Page 69: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/69.jpg)
Thread 1 Thread 2
Shared memoryA
Thead 2: write A
AA
write barrier
A
![Page 70: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/70.jpg)
Thread 1 Thread 2
Shared memoryA
Thead 2: write A
AA
write barrier
AAA
![Page 71: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/71.jpg)
Thread 1 Thread 2
Shared memoryA
Thead 1: read A
A
A
read barrier
A
A
A
A A
![Page 72: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/72.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/73.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/74.jpg)
SC Reality: atomicity
![Page 75: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/75.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/76.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/77.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/78.jpg)
How?
![Page 79: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/79.jpg)
![Page 80: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/80.jpg)
Synchronization order
1
2
44
SA
SA
SA
SA
Thread 1 Thread 2
55
3
3
12
![Page 81: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/81.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/82.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/83.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/84.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/85.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/86.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/87.jpg)
What have we learned?
1. Program order
2. Memory model
3. Sequential Consistency
4. Synchronization action
5. Synchronization order
![Page 88: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/88.jpg)
Synchronizes with
2
1
3
2
1
4 4
3
SA
SA
Thread 1 Thread 2
![Page 89: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/89.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/90.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/91.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/92.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/93.jpg)
![Page 94: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/94.jpg)
2
1
3
2
4
1
4
3
SA
SA
Thread 1 Thread 2
5 5
One more thing
![Page 95: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/95.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/96.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/97.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/98.jpg)
Happens-before
Program OrderSynchronizati
on Order
Synchronizes
With
Happens-before
Visibility
![Page 99: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/99.jpg)
Happens-before for smarties
HB = {PO & SW}+
![Page 100: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/100.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/101.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/102.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/103.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/104.jpg)
![Page 105: Николай Папирный Тема: "Java memory model для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/105.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/106.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/107.jpg)
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 для простых смертных"](https://reader030.vdocuments.us/reader030/viewer/2022032615/55a2802b1a28ab1a408b4778/html5/thumbnails/108.jpg)
Reading