System komputerowy tworzy grupa współpracujących procesów, wewnątrz których może się również znajdować wiele wątków wykonania. To powoduje problemy z **synchronizacją** dostępu do danych przez te procesy/wątki współdzielonych. Może się np. zdarzyć, że jeden z procesów modyfikuje rekord w pamięci, a w tym samym czasie drugi próbuje ten sam rekord odczytać. Pożądanym wynikiem odczytu jest rekord sprzed modyfikacji albo rekord całkowicie zmodyfikowany. Niestety, bez dodatkowych zabiegów ze strony programisty, rezultatem odczytu może być rekord tylko częściowo zmodyfikowany, czyli **niespójny** (np. w reprezentacji rachunku bankowego proces zapisujący zmodyfikował już numer konta, a nie zdążył zmodyfikować danych osobowych jego posiadacza). Taka sytuacja jest niedopuszczalna, na szczęście sprzęt i system operacyjny udostępniają sporo **środków synchronizacji** by jej zaradzić.
Na wykładzie poznamy i w praktyce zastosujemy **prymitywy synchronizacyjne**, w tym: instrukcje atomowe, muteksy, semafory, zmienne warunkowe, monitory oraz bardziej skomplikowane np. bariery czy blokady czytelników i pisarzy. Pokażemy, jak rozwiązywać i **analizować poprawność** klasycznych **problemów synchronizacji** z użyciem tych środków. Poznamy przykłady **nieblokujących struktur danych**, zapewniających synchronizację jedynie z użyciem instrukcji atomowych. Dowiemy się jaką rolę pełni **model pamięci** języka programowania w analizie poprawności algorytmów współbieżnych.
Wykład będzie prowadzony na podstawie książki
[The Art of Multiprocessor Programming, 2nd ed.](https://www.amazon.pl/Art-Multiprocessor-Programming-Maurice-Herlihy/dp/0124159508/) oraz kursu [Parallel Programming (ETH Zürich)](https://spcl.inf.ethz.ch/Teaching/2020-pp/)
Od studenta wymagana jest elementarna znajomość Javy (na poziomie umiejętności zaimplementowania listy łączonej), jako że w tym języku prowadzony będzie wykład. Okazjonalnie pojawić się może kod w C/C++.