After many years, support for multithreading has been integrated into main-stream programming languages. Inclusion of this feature brings with it a need for a clear and direct explanation of how threads interact through memory. Pro-grammers need to be told, simply and clearly, what might happen when their programs execute. Compiler writers need to be able to work their magic without interfering with the promises that are made to programmers. Java’s original threading specification, its memory model, was fundamentally flawed. Some language features, like volatile fields, were under-specified: their treatment was so weak as to render them useless. Other features, including fields without access modifiers, were over-specified: the memory model...