---
# System prepended metadata

title: Zadanie 2

---

### Zadanie 2
![image](https://hackmd.io/_uploads/SJhqhDpd6.png)

Problem ABA w informatyce jest problemem występującym w algorytmach wielowątkowych korzystających z atomowych instrukcji porównania i zamiany, takich jak compareAndSet(). Problem ten pojawia się, gdy wątek A odczytuje wartość z pamięci (np. A), następnie jest wstrzymywany, a wątek B zmienia tę wartość na inną (np. B) i z powrotem na pierwotną (A) przed wznowieniem działania wątku A. Gdy wątek A jest wznowiony, widzi tę samą wartość (A), co na początku, i zakłada, że nic się nie zmieniło, mimo że w międzyczasie miały miejsce inne operacje.

compareAndSet() sprawdza, czy wartość w pamięci jest równa oczekiwanej wartości i tylko wtedy przeprowadza aktualizację. W kontekście problemu ABA,compareAndSet() nie rozpoznaje, że między odczytami wartość była zmieniona na inną i z powrotem, co może prowadzić do błędów w logice programu.
![image](https://hackmd.io/_uploads/SJMweO6ua.png)

![image](https://hackmd.io/_uploads/HJYqGOp_6.png)
Klasa AtomicStampedReference zawiera pole stamp które jest aktualizowane za każdym razem po użyciu compareAndSet().

### Zadanie 3
![image](https://hackmd.io/_uploads/ryLuw_aOp.png)
Główną cechą sychronicznych struktur danych jest to, że operacje wstawiania i usuwania elementów muszą być wykonywane równocześnie przez różne wątki, co oznacza, że jeden wątek czeka na drugi, aby ukończyć operację.

SynchronousQueue to kolejka, która nie przechowuje rzeczywiście żadnych elementów. Zamiast tego działa jako punkt wymiany między wątkami. Gdy jeden wątek próbuje włożyć element do SynchronousQueue, jest on zatrzymywany, aż inny wątek spróbuje pobrać element z tej kolejki. Podobnie, wątek próbujący pobrać element czeka, aż inny wątek umieści w niej element. W ten sposób, SynchronousQueue działa jako rodzaj synchronizacji między wątkami.

Spotkanie (ang. rendezvous) odnosi się do tego momentu, w którym dwa wątki spotykają się i współdziałają. W przypadku SynchronousQueue, spotkanie ma miejsce, gdy jeden wątek umieszcza element w kolejce, a drugi jednocześnie go pobiera. Jest to podstawowy mechanizm synchronizacji, który umożliwia koordynację działań między wątkami bez potrzeby używania dodatkowych mechanizmów synchronizacji, takich jak blokady czy semafory.

Synchroniczne struktury danych są szczególnie użyteczne w scenariuszach, gdzie wymagana jest ścisła koordynacja między wątkami, na przykład w systemach czasu rzeczywistego, w przetwarzaniu równoległym, czy w sytuacjach, gdzie kolejność operacji jest kluczowa dla prawidłowego funkcjonowania programu.


![image](https://hackmd.io/_uploads/BkFYC_Tda.png)

![image](https://hackmd.io/_uploads/H1MuCuada.png)
