Concurrency Desc

Model wielowątkowości javy zakłada to że wątki mają dostęp do tych samych danych, co jest bardzo sensowne (bo szybkie - czyli utworzenie nowego wątku nie powoduje kopiowania żadnych danych - zatem można mieć 1000 wątków w programie javy i daje rade).

Ma on jednak jedną wadę: z danymi mogą dziać się różne rzeczy kiedy jest do nich dostęp z wielu wątków.

Na przykład:

class foo{
    private int i = 0; 
 
    void next(){
        i++;
        i++;
    }
 
    int get(){
        return i;
    }
}

Wątek który woła na instancji Foo (która jest dostępna dla innych wątków metodę get() nie ma gwarancji że zawsze zobaczy liczbę parzystą.

Może być tak:
Wątek A: rozpoczyna wykonanie next()
Wątek A: dodaje 1 do i
Wątek B: czyta i
Wątek A: dodaje 1 do i

Może być też tak:
Wątek B: czyta i i kopiuje je do swojego kesza obiektów.
Potem nie widać zmian i które są wykonywane z innych wątków.

Co kompilator może zrobić żeby nam utrudnić życie:

  • Wątki mogą (ale nie muszą) kopiować sobie niektóre zmienne do swojej własnej pamięci.
  • Kompilator może w ramach funkcji przestawiać kolejność wykonywania wyrażeń. To przestawianie nie może zmienić wyniku działania w ramach jednego wątku ale przy wielu to już co innego.
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-NonCommercial-NoDerivs 3.0 License