java memory modelpugh/java/jmmslides.pdf · 3 the java memory model • chapter 17 of the java...
TRANSCRIPT
![Page 1: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/1.jpg)
Fixing the Java Memory Model
William PughDept. Of Computer Science
Univ. of Maryland
http://www.cs.umd.edu/~pugh/java
![Page 2: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/2.jpg)
2
Overview
• Memory Models, and the JMM in particular• The JMM is too strong
– prohibits standard compiler optimizations• done by most existing JVM’s,
in violation of the spec
• The JMM is too weak– initialization safety issues– related type-safety issue in implementation
![Page 3: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/3.jpg)
3
The Java Memory Model• Chapter 17 of the Java Language
Specification (and Chap 8 of the VM Spec)• Describes how threads interact via locks
and read/writes to memory• Done in a style totally foreign to all other
work on memory models• Very hard to understand
– At first I thought I was just dense– Eventually I figured out that no one
understands it
![Page 4: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/4.jpg)
4
What is a memory model?
• If two threads havea data race, whatbehaviors areallowed?
• Sequentialconsistency– interleave memory
operations consistentwith original orderingin each thread
a = 0; b = 0
x = a
b = 1
y = b
a = 1
? x = 1 & y = 1
![Page 5: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/5.jpg)
4
What is a memory model?
• If two threads havea data race, whatbehaviors areallowed?
• Sequentialconsistency– interleave memory
operations consistentwith original orderingin each thread
a = 0; b = 0
x = a
b = 1
y = b
a = 1
? x = 1 & y = 1
![Page 6: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/6.jpg)
4
What is a memory model?
• If two threads havea data race, whatbehaviors areallowed?
• Sequentialconsistency– interleave memory
operations consistentwith original orderingin each thread
a = 0; b = 0
x = a
b = 1
y = b
a = 1
? x = 1 & y = 1
![Page 7: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/7.jpg)
5
MM’s can interfere withoptimization
• In each thread, no ordering constraintbetween actions in that thread
• Compiler could decide to reorder• Processor architecture might perform out of
order• Sequential consistency prohibits almost all
reordering of memory operations– unless you can prove accessed by single thread
![Page 8: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/8.jpg)
6
Do programmers care about thedetails of MM’s?
• If you are writing synchronizationprimitives– You care deeply about the memory model your
processor supports
• But if you have synchronized everythingproperly– do you really care?
![Page 9: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/9.jpg)
7
The Java Memory Model• Idea (apparently):
– threads have a local memory (cache, registers?)– Threads fill from/flush to global memory
• System modeled by constraints between actions– Use/assign actions correspond to thread computations– load/store actions correspond to thread fill/flush actions– read/write actions are main memory actions
• Not like any other memory model– don’t ask me why, or ask me to defend it
![Page 10: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/10.jpg)
8
Memory Model actions,without prescient stores
use a
assign buse b
assign a
a = 0; b = 0
x = a
b = 1
y = b
a = 1
not possible: x = 1 & y = 1
![Page 11: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/11.jpg)
8
Memory Model actions,without prescient stores
use a
assign buse b
assign a
a = 0; b = 0
x = a
b = 1
y = b
a = 1
not possible: x = 1 & y = 1
read a
load a
![Page 12: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/12.jpg)
8
Memory Model actions,without prescient stores
use a
assign buse b
assign a
a = 0; b = 0
x = a
b = 1
y = b
a = 1
not possible: x = 1 & y = 1
read a
load a read bload b
![Page 13: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/13.jpg)
8
Memory Model actions,without prescient stores
use a
assign buse b
assign a
a = 0; b = 0
x = a
b = 1
y = b
a = 1
not possible: x = 1 & y = 1
read a
load a read bload b
store b
write b
![Page 14: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/14.jpg)
8
Memory Model actions,without prescient stores
use a
assign buse b
assign a
a = 0; b = 0
x = a
b = 1
y = b
a = 1
not possible: x = 1 & y = 1
read a
load a read bload b
store b
write b store a
write a
![Page 15: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/15.jpg)
9
Memory Model actions,with prescient stores
a = 0; b = 0
x = a
b = 1
y = b
a = 1
possible: x = 1 & y = 1
read a
load a
use a
assign b
store b
write b
read bload b
use b
assign a
store a
write a
![Page 16: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/16.jpg)
10
Coherent memory
• Once you see anupdate by anotherthread– can’t forget that
you’ve seen the update
• Cannot reorder tworeads of the samememory location
p.x++ a = p.x
b = p.x
assert( a ≤ b)
![Page 17: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/17.jpg)
11
Reads kill reuse
• Must treat “may reads”as kills– a read may cause your
thread to become awareof a write by anotherthread
• Can’t replace c = p.xwith c = a
p and q mightpoint to same object
p.x++ a = p.x
b = q.x
assert( p = q implies a ≤ b ≤ c)
c = p.x
![Page 18: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/18.jpg)
12
Most JVM’s violate Coherence
• Every JVM I’ve tested that eliminatesredundant loads violates Coherence:– Sun’s Classic Wintel JVM– Sun’s Hotspot Wintel JVM– IBM’s 1.1.7b Wintel JVM– Sun’s production Sparc Solaris JVM– Microsoft’s JVM
• Bug # 4242244 in Javasoft’s bug parade– JVM’s don’t match spec
![Page 19: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/19.jpg)
13
• Preliminary work by Dan Scales, DecWRL• Made reads kill, have side effects• Better is probably possible,
but will require work• Reads have side effects
but can be donespeculatively– change intermediate representation
Impact on CompilerOptimizations?
compress 1.18 mpegaudio 1.44jess 1.03 richards 0.98cst 1.01 mtrt 1.02db 1.04 jack 1.06si 1.03 tsgp 1.36javac 0.99 tmix 1.11
![Page 20: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/20.jpg)
14
Should the JMMrequire Coherence?
• Present in many processor memory models– They don’t have the aliasing problem
• Comes at a cost– performance– rethinking compiler design
• Violated by existing VM’s– programmers can’t depend on it
![Page 21: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/21.jpg)
15
The really bad news
• The JMM is a mess• I tried to prove that the JMM required
exactly coherence– Was able to prove it requires coherence
• Tried to prove it requires nothing more– Got a nasty counter example
• Ordering constraints between memoryoperations on different memory locations
![Page 22: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/22.jpg)
16
Counter Example• Consider the following code,
and a run in which– p and q happen to reference the same object– the read of q.x sees a different value than p.x
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
![Page 23: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/23.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
![Page 24: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/24.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
![Page 25: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/25.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
![Page 26: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/26.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
![Page 27: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/27.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
![Page 28: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/28.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
![Page 29: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/29.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
![Page 30: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/30.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
![Page 31: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/31.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
![Page 32: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/32.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
![Page 33: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/33.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
![Page 34: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/34.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
![Page 35: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/35.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
![Page 36: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/36.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
store p.x
![Page 37: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/37.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
store p.x
§ 17.3, 2nd list of bullets, bullet 2: for eachstore, a corresponding following write
![Page 38: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/38.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
store p.x
§ 17.3, 2nd list of bullets, bullet 2: for eachstore, a corresponding following write
write p.x
![Page 39: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/39.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
store p.x
§ 17.3, 2nd list of bullets, bullet 2: for eachstore, a corresponding following write
write p.x
§ 17.8: A prescient store can occur beforethe corresponding assign
![Page 40: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/40.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
store p.x
§ 17.3, 2nd list of bullets, bullet 2: for eachstore, a corresponding following write
write p.x
§ 17.8: A prescient store can occur beforethe corresponding assign
![Page 41: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/41.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
store p.x
§ 17.3, 2nd list of bullets, bullet 2: for eachstore, a corresponding following write
write p.x
§ 17.8: A prescient store can occur beforethe corresponding assign
§ 17.8, bullet 3: No load intervenesbetween the assign and the correspondingprescient store
![Page 42: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/42.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
store p.x
§ 17.3, 2nd list of bullets, bullet 2: for eachstore, a corresponding following write
write p.x
§ 17.8: A prescient store can occur beforethe corresponding assign
§ 17.8, bullet 3: No load intervenesbetween the assign and the correspondingprescient store
![Page 43: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/43.jpg)
17
// p & q are aliased
i = r.y;j = p.x;// concurrent write to p.x
k = q.x;p.x = 42;
use r.y
use p.x
use p/q.x
assign p.x
§ 17.3, bullet 1: all use and assign actionsmust occur in their original order
use p.x
use p/q.x
§ 17.3, bullet 4: a load or assign before a use
load r.y
§ 17.3, 2nd list of bullets, bullet 1: for eachload, a corresponding preceding read
read r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
§ 17.6, bullet 1: between an assign and anunlock (or thread termination!), a storemust intervene
store p.x
§ 17.3, 2nd list of bullets, bullet 2: for eachstore, a corresponding following write
write p.x
§ 17.8: A prescient store can occur beforethe corresponding assign
§ 17.8, bullet 3: No load intervenesbetween the assign and the correspondingprescient store
p.x = 42; read r.y
load r.y
load p.x
read p.x
load p/q.x
write p.x
store p.x
use r.y
use p.x
use p/q.x
assign p.x
![Page 44: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/44.jpg)
18
Memory barriers required
• Many processors have a relaxed memorymodel
• This constraint (read of r.y before write ofp.x) not supported on most relaxed memorymodels
• Memory barrier required
![Page 45: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/45.jpg)
19
Reordering memory references
• Read of r.y must occur before write to p.x– but read of r.y could occur after read of p.x
• Can we reorder read of r.y and p.x as acompiler optimization– and use a simple internal representation
• e.g., bytecode
![Page 46: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/46.jpg)
20
Reorderingmemory
refs in IR
![Page 47: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/47.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
![Page 48: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/48.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
![Page 49: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/49.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
![Page 50: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/50.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
reorderreads of
r.y and p.x
![Page 51: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/51.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
reorderreads of
r.y and p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
r.y and p.x
![Page 52: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/52.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
reorderreads of
r.y and p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
r.y and p.x
?
![Page 53: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/53.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
reorderreads of
r.y and p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
r.y and p.x
?
getfield p.x...getfield r.y...getfield q.x...putfield p.x
![Page 54: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/54.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
reorderreads of
r.y and p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
r.y and p.x
?
getfield p.x...getfield r.y...getfield q.x...putfield p.x
![Page 55: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/55.jpg)
20
Reorderingmemory
refs in IR
getfield r.y...getfield p.x...getfield q.x...putfield p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
reorderreads of
r.y and p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
r.y and p.x
?
getfield p.x...getfield r.y...getfield q.x...putfield p.x
?
![Page 56: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/56.jpg)
21
Reorder uses of p.x and r.y
• Reorder thebytecodes forreading p.x and r.y– reorder uses
• Don’t need toperform the read ofr.y before the writeof p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
![Page 57: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/57.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
![Page 58: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/58.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
![Page 59: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/59.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
![Page 60: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/60.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
![Page 61: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/61.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
use r.y
use p.x
use p/q.x
assign p.x
load p.x
load p/q.x
store p.x
read p.x
read p/q.x
write p.x
write p.x
load r.y read r.y
![Page 62: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/62.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
use r.y
use p.x
use p/q.x
assign p.x
load p.x
load p/q.x
store p.x
read p.x
read p/q.x
write p.x
write p.x
load r.y read r.y
![Page 63: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/63.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
use r.y
use p.x
use p/q.x
assign p.x
load p.x
load p/q.x
store p.x
read p.x
read p/q.x
write p.x
write p.x
load r.y read r.y
invalid!
![Page 64: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/64.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
use r.y
use p.x
use p/q.x
assign p.x
load p.x
load p/q.x
store p.x
read p.x
read p/q.x
write p.x
write p.x
load r.y read r.y
invalid!invalid!
![Page 65: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/65.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
use r.y
use p.x
use p/q.x
assign p.x
load p.x
load p/q.x
store p.x
read p.x
read p/q.x
write p.x
write p.x
load r.y read r.y
invalid!invalid!
invalid!
![Page 66: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/66.jpg)
22
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
read r.y
load r.y
load p.x
read p.x
load p/q.x read p/q.x
write p.x
store p.xwrite p.x
use r.y
use p.x
use p/q.x
assign p.x
getfield r.y...getfield p.x...getfield q.x...putfield p.x
getfield p.x...getfield r.y...getfield q.x...putfield p.x
reorderreads of
r.y and p.x
use r.y
use p.x
use p/q.x
assign p.x
load r.y
load p.x
load p/q.x
store p.x
read r.y
read p.x
read p/q.x
write p.x
write p.x
use r.y
use p.x
use p/q.x
assign p.x
load p.x
load p/q.x
store p.x
read p.x
read p/q.x
write p.x
write p.x
load r.y read r.y
invalid!invalid!
invalid!
invalid!
![Page 67: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/67.jpg)
23
If you respect the current JMM
• If you want to do any reordering of memoryreferences– Must use JMM’s double indirection in your
compiler’s intermediate representation– Must reason about whether there exists any
downstream component that might do areordering that, when composed with yourreordering, is illegal
• e.g., the processor
![Page 68: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/68.jpg)
24
This is ugly
• I went over it with Guy Steele– agrees (tentatively) that with constraints I
derived
• Definitely not intended• Argument for scrapping the current JMM
– patches to fix it will just make it harder tounderstand
• just hide the bugs, not fix them
![Page 69: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/69.jpg)
25
What do we need/want?
• Need to be able to reason about whethercompiler transformations are legal withrespect to memory model– The clearer, the better
• Want to avoid changing/discardingcompiler techniques for non-synchronizedcode
![Page 70: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/70.jpg)
26
My proposed Java Memory Model
• Actions within a thread can be reordered inany way that respects the data dependencieswithin that thread
• Global behavior some interleaving ofreordered actions
• Also need to allow for scalar replacement(equivalently write buffers) and dead storeelimination
• Plus stuff for locks and volatile variables
![Page 71: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/71.jpg)
27
The Java memory modelis too weak
• Idioms used by many programmers aren’tthread safe, but– are widely used (including in Sun’s JDK)– are thought to be safe by many– create initialization-safety issues– create type-safety issues in implementation
• Joshua Bloch of Javasoft first highlightedthis issue
• (Only issue for multiprocessor systems)
![Page 72: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/72.jpg)
28
Could see reference to objectbefore fields of object
• This isn’t guaranteed to workclass A { Point p; synchronized void setPos(int x, int y) {
p = new Point(x, y);}
double distanceToOrigin() {// not synchronized
Point q = p;return Math.sqrt(q.x*q.x + q.y*q.y);}
}
![Page 73: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/73.jpg)
29
Reading Garbage
• An implementation issue, not a spec issue• What if another thread sees an object before
the writes that initialize the objects fields todefault values (e.g., null)?– major type safety breach– not a problem if objects allocated out of pre-
zeroed memory
• What if another thread sees an object beforethe writes that initialize the object header?
![Page 74: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/74.jpg)
30
Are constructors special?
• writes in constructor: synchronized void setPos(int x, int y) {
p = new Point(x, y);}
• writes outside of constructor: synchronized void setPos(int x, int y) {
Point tmp = new Point();tmp.x = x;tmp.y = y;}p = tmp;}
![Page 75: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/75.jpg)
31
My suggestion for fixing this
• The system must not reorder:– A write during the construction of object X– A store of a reference to X
• after the constructor for X has terminated
• Read side handled already by requiring datadependence be respected
![Page 76: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/76.jpg)
32
Commentary• Doesn’t handle the general case
– outside of constructors
• Doesn’t use barriers– lightweight object construction becomes
heavyweight• e.g. unboxed complex numbers
– memory barriers harder to eliminate throughanalysis
• Leverages off of barriers that might berequired for garbage collection
![Page 77: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/77.jpg)
33
Summary
• No one understands the current model• Java memory model is too strong
– Coherence– Hairball
• Java memory model is too weak– initialization safety issues– type safety implementation issue
• Consensus is that it needs to be replaced– but with what?
![Page 78: java Memory Modelpugh/java/jmmSlides.pdf · 3 The Java Memory Model • Chapter 17 of the Java Language Specification (and Chap 8 of the VM Spec) • Describes how threads interact](https://reader031.vdocuments.site/reader031/viewer/2022020214/5a9f4d037f8b9a8e178c8edf/html5/thumbnails/78.jpg)
Questions?