To provide a working knowledge of the hardware and architecture of a computer system, particularly focusing on aspects such as memory hierarchy, cache coherence and multi-threaded hardware support that affect a full understanding of how to write multi-threaded software. This is a practical course, grounded in a theoretical understanding of concurrency and the problems and benefits it brings. We will use multi-threaded Java and provide an understanding of how to apply appropriate concurrency control primitives where there is simultaneous access to shared resources.