COURSE OUTLINE

Session 1

Introduction to the Course
Course syllabus, logistics, grading. Introduction to the concurrency and
the parallelism. Hardware support. Real-world environments that exhibit parallelism

Session 2

Multithreaded Programming in Java
Basic primitives; challenges and issues; threading in Java; synchronisation primitives

Session 3

Basic Patterns and Techniques
Data/work-parallelism; load balancing and distribution; synchronisation and communication

Session 4

Higher-level Abstractions
Executors and futures; structure and composability

Session 5

Practical Session & Laboratories
Exercises in the multithreaded programming

Session 7

Practical Session & Laboratories
Exercises on the performance analysis

Session 8

Foundations of the Shared Memory Computing
The model; causality; linearizability; lock-free & wait-free computing; fairness; safety and liveness properties

Session 9

Locks & Registers
Different kinds of locks;
Different properties of the R/W operations; equivalence and expressiveness

Session 10

Consensus
The definition of consensus; implementation; universality of the consensus

Session 11

Practical Session & Laboratories
Exercises in the wait-free computing

Session 12

Impossibility Results
Consensus numbers; FLP theorem; implications for the real-world applications

Session 6

Performance of the Multithreaded Programs
Common pitfalls; tooling to investigate performance issues;  basics of systems performance

Session 13

Introduction to the Distributed Computing
The model; happens-before relation; clocks and ordering; communication; registers and consensus in the distributed setting

Session 14

Failures and their Effects
Failure models; Paxos algorithm and its importance; FLP in the distributed setting; fault tolerance in practice 

Session 15

Practical Session & Laboratories
Exercises in the distributed computing