240 likes | 414 Views
Specifying Java Thread Semantics Using a Uniform Memory Model. Jason Yue Yang Ganesh Gopalakrishnan Gary Lindstrom School of Computing University of Utah. Multithreading in Java. Supported at language level Need a formal memory model (thread semantics) Current JMM
E N D
Specifying Java Thread Semantics Using a Uniform Memory Model Jason Yue Yang Ganesh Gopalakrishnan Gary Lindstrom School of Computing University of Utah
Multithreading in Java • Supported at language level • Need a formal memory model (thread semantics) • Current JMM • Java Language Specification, Chap 17 • It is broken
Problems with the Current JMM • Too strong • Strict ordering constraints • Strict synchronization visibility requirements • Too weak • Reference escaping prematurely from constructor • Final field specification omitted • Volatile variable operations have no visibility requirement on normal variable operations
Example: Double-Checked Locking Idiom is Broken class foo { private static Resource resource = null; public static Resource get() { if (resource == null) { synchronized (this) { if (resource == null) resource = new Resource(); } } return resource; } }
Improvement Efforts • JSR-133: JMM and thread specification • JMM mailing list • http://www.cs.umd.edu/~pugh/java/memoryModel • Replacement proposals • Manson and Pugh’s Model (JMMMP) • Based on set notation • The CRF Model (JMMCRF) • Commit / Reconcile / Fence
Motivations • Stronger capability of formal verification • More uniform notation • Greater flexibility • More comprehensive support for language level models • E.g., local variable behaviors in thread interactions
UMM (Uniform Memory Model) • Abstract transition system • Memory model specified as guarded commands • Executable with an integrated model checker • Flexible configuration • Can specify various memory models • Uniform architecture • Parameterizes differences among memory models • Semantics primarily based on JMMMP
UMM Conceptual Architecture Threadi Threadj LVi LIB – Local Instruction BufferLV– Local Variable Array GIB – Global Instruction BufferLK– Lock Array LIBi LIBj LVj GIB LK
Instruction Definition • <t, pc,op, var, data, local, useLocal, lock, time> • t: issuing thread • pc: program counter • op: operation type • var: variable • data: data value • local: local variable • useLocal: tag for using local variable • lock: lock • time: global time stamp
Critical Memory Model Properties • Program order • Instruction order determined by software • Visibility order • Final observable order perceived by threads • Mutual exclusion
General Strategy in UMM • Enabling mechanism • Program order may be relaxed to enable certain interleaving • Controlled via bypassing table • Filtering mechanism • Legal execution trace constructed from GIB following proper ordering requirements • Enforced in readselection rules
Bypassing Policies • Controlled by table BYPASS • ready(i), iff jLIBt(i) : pc(j) < pc(i) (localDependent(i, j) BYPASS[op(j)][op(i)] = No)
Condition legalNormalRead • EnforcesSerialization • Read gets data from the most recent previous write • legalNormalRead(i), iff op(w) = WriteNormal var(w) = var(r) ( w’GIB : op(w’) = WriteNormal var(w’) = var(r) ordered(i, w’) ordered(w’, w) )
The Ordering Requirement • Operations i1 and i2 are ordered, iff they are • ordered by program order, • synchronized by the same lock or volatile variable, or • transitively ordered by another intermediate operation • ordered(i1, i2), iff programOrdered(i1, i2) synchronized(i1, i2) ( i’GIB : ordered(i1, i’) ordered(i’, i2) )
UMM Implementation in Mur • The JMM engine • Precisely defines the thread semantics • Primarily based on semantics of JMMMP • Implemented as Mur rules and functions • Test Suite • Carefully picked test cases • Captures the essence of interesting properties • Implemented with corresponding Mur initial states and invariants
Analysis of the JMM • Ordering Property • Coherence • Write atomicity • Causality • Prescient write • Synchronization Property • Constructor Property
Example: Prescient Write Behavior Initially, a = 0 Finally, can it result in r1 = 1 & r2 = 1? • Result: Yes • Hence, anti-dependence (Read after Write)is not guaranteed
Benefits • Support for formal verification • Executable style – finds results immediately • Exhaustive enumeration – reveals corner cases • Rigorous specification – reduces ambiguities • Generic and uniform interface • Enables configuration and comparison • Simple architecture • Eliminates architecture-specific complexities
Limitations • Not intended to be the actual implementation • State explosion problem • Limited to simple test cases
Ongoing Efforts • Comprehensive coverage for many common memory models • Support for theorem proving technique
For More Information … • UMM prototype • http://www.cs.utah.edu/~yyang/research • JMM mailing list archive • http://www.cs.umd.edu/~pugh/java/memoryModel/ • JSR-133: JMM and thread specification • http://jcp.org/jsr/detail/133.jsp • JSR-166: Concurrency utility • http://jcp.org/jsr/detail/166.jsp