Practical Concurrent and Parallel Programming, MSc CS
This course is about that part of programming that focuses on parallelism and concurrency. The Java programming language is the language used for practically addressing such aspects.
Parallel and Concurrent Programming used to be an exception in the past: it is now the norm and all software systems are mostly made by several entities concurrently interacting with each other. Therefore, it is extremely important that computer science graduates acquire this knowledge.
In this course you learn how to write correct and efficient concurrent and parallel software, primarily using Java, on standard shared-memory multicore hardware such as laptops, desktops and servers.
The course covers basic mechanisms such as threads, locks and shared memory as well as more advanced mechanisms such as functional parallel stream operations, transactional memory, message passing, and lock-free data structures implemented using atomic compare-and-swap instructions. It covers concepts such as atomicity, safety, liveness and deadlock. It covers how to measure and understand performance and scalability of parallel programs. It covers tools and methods to find bugs in concurrent programs, and reason about their correctness.
Topics covered include:
- Threads and locks in Java, shared mutable memory, mutual exclusion, atomic operations, avoiding sharing (thread confinement, stack confinement), designing thread-safe classes, the Java monitor pattern, object graph sharing.
- Visibility, volatile, immutable objects, final, the Java memory model.
- Functional programming, stream pipelines for bulk data, parallel operations on streams and arrays.
- Performance and scalability, performance measurements, scalability case studies: concurrent hashmap, parallel quicksort.
- Tasks, the Java executor framework, concurrent pipelines, blocking queues.
- Concurrency and single-threaded GUI applications.
- Testing concurrent programs, correctness, safety and liveness concepts, deadlock, livelock, tools.
- Transactional memory, the Multiverse library.
- Optimistic concurrency, lock-free data structures, Treiber stack, compare-and-swap, the Michael and Scott queue, progress concepts, how to implement a lock.
- Message passing concurrency, concepts from Erlang, the Java Akka framework.
Formal prerequisitesStudents must know the Java programming language very well, including inner classes, generics, and a first exposure to threads and locks, and event-based graphical user interfaces as in Swing or AWT.
Intended learning outcomes
After the course, the student should be able to:
- ANALYSE the correctness of concurrent Java software, and RELATE it to the Java memory model
- ANALYSE the performance of concurrent Java software
- APPLY Java threads and related language features (locks, final and volatile fields) and libraries (concurrent collections) to CONSTRUCT correct and well-performing concurrent Java software
- USE software tools for accelerated testing and analysis of concurrency problems in Java software
- CONTRAST different communication mechanisms (shared mutable memory, transactional memory, message passing)
Ordinary examExam type:
C: Submission of written work, External (7-point scale)
C22: Submission of written work – Take home