Synchronizacja w języku Java

Transkrypt

Synchronizacja w języku Java
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Synchronizacja wątków w języku Java
Wojciech Rząsa
[email protected]
Katedra Informatyki i Automatyki, Politechnika Rzeszowska
28 marca 2014
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
1/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Plan
1 Wstęp
2 Monitory
3 Monitory w Javie
4 Wykorzystanie
5 Czytelnicy i pisarze
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
2/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Plan
1 Wstęp
2 Monitory
3 Monitory w Javie
4 Wykorzystanie
5 Czytelnicy i pisarze
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
3/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Synchronizacja
Operacje na wspólnych danych wymagają synchronizacji
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
4/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Synchronizacja
Operacje na wspólnych danych wymagają synchronizacji
Konieczne definiowanie operacji niepodzielnych
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
4/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Synchronizacja
Operacje na wspólnych danych wymagają synchronizacji
Konieczne definiowanie operacji niepodzielnych
Oczekiwanie na zmianę
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
4/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Synchronizacja
Operacje na wspólnych danych wymagają synchronizacji
Konieczne definiowanie operacji niepodzielnych
Oczekiwanie na zmianę
Powiadamianie o zmianach
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
4/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
5/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wbudowane w język – pewne, bezpieczne
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
5/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wbudowane w język – pewne, bezpieczne
Wygodne
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
5/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wbudowane w język – pewne, bezpieczne
Wygodne
Zapewniające
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
5/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wbudowane w język – pewne, bezpieczne
Wygodne
Zapewniające
Niepodzielność operacji
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
5/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Mechanizmy synchronizacji
Java zapewnia mechanizmy synchronizacji
Wbudowane w język – pewne, bezpieczne
Wygodne
Zapewniające
Niepodzielność operacji
Oczekiwanie, powiadamianie
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
5/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Plan
1 Wstęp
2 Monitory
3 Monitory w Javie
4 Wykorzystanie
5 Czytelnicy i pisarze
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
6/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Łatwiejszy w użyciu niż semafory
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Łatwiejszy w użyciu niż semafory
Mniejsze prawdopodobieństwo błędu
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Łatwiejszy w użyciu niż semafory
Mniejsze prawdopodobieństwo błędu
Doskonale pasuje do programowania obiektowego
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Łatwiejszy w użyciu niż semafory
Mniejsze prawdopodobieństwo błędu
Doskonale pasuje do programowania obiektowego
Monitor
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Łatwiejszy w użyciu niż semafory
Mniejsze prawdopodobieństwo błędu
Doskonale pasuje do programowania obiektowego
Monitor
Grupuje dane (zmienne) i operacje
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Łatwiejszy w użyciu niż semafory
Mniejsze prawdopodobieństwo błędu
Doskonale pasuje do programowania obiektowego
Monitor
Grupuje dane (zmienne) i operacje
Zapewnia dostęp do operacji dla najwyżej jednego wątku
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Łatwiejszy w użyciu niż semafory
Mniejsze prawdopodobieństwo błędu
Doskonale pasuje do programowania obiektowego
Monitor
Grupuje dane (zmienne) i operacje
Zapewnia dostęp do operacji dla najwyżej jednego wątku
Program może zawierać wiele monitorów
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Strukturalny mechanizm synchronizacji
Łatwiejszy w użyciu niż semafory
Mniejsze prawdopodobieństwo błędu
Doskonale pasuje do programowania obiektowego
Monitor
Grupuje dane (zmienne) i operacje
Zapewnia dostęp do operacji dla najwyżej jednego wątku
Program może zawierać wiele monitorów
Synchronizacja na różnych monitorach jest niezależna
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
7/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Zmienne warunkowe (condition)
Monitory mogą też zawierać zmienne warunkowe (condition)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
8/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Zmienne warunkowe (condition)
Monitory mogą też zawierać zmienne warunkowe (condition)
Zmienne warunkowe pozwalają oczekiwać na zmianę warunku
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
8/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Zmienne warunkowe (condition)
Monitory mogą też zawierać zmienne warunkowe (condition)
Zmienne warunkowe pozwalają oczekiwać na zmianę warunku
Wątki oczekujące na zmiennej warunkowej można powiadomić
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
8/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Monitory zapewniają wykluczanie przy dostępie do operacji
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
9/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Monitory zapewniają wykluczanie przy dostępie do operacji
Zmienne monitorów są „prywatne”
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
9/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Monitory zapewniają wykluczanie przy dostępie do operacji
Zmienne monitorów są „prywatne”
Monitory zapewniają możliwość pasywnego oczekiwania
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
9/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Monitory zapewniają wykluczanie przy dostępie do operacji
Zmienne monitorów są „prywatne”
Monitory zapewniają możliwość pasywnego oczekiwania
Oczekiwanie na zmiennych warunkowych
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
9/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Monitory zapewniają wykluczanie przy dostępie do operacji
Zmienne monitorów są „prywatne”
Monitory zapewniają możliwość pasywnego oczekiwania
Oczekiwanie na zmiennych warunkowych
Powiadamianie
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
9/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Monitory zapewniają wykluczanie przy dostępie do operacji
Zmienne monitorów są „prywatne”
Monitory zapewniają możliwość pasywnego oczekiwania
Oczekiwanie na zmiennych warunkowych
Powiadamianie
Mechanizm strukturalny (automatyczne uzyskanie i zwolnienie
blokad)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
9/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory
Monitory zapewniają wykluczanie przy dostępie do operacji
Zmienne monitorów są „prywatne”
Monitory zapewniają możliwość pasywnego oczekiwania
Oczekiwanie na zmiennych warunkowych
Powiadamianie
Mechanizm strukturalny (automatyczne uzyskanie i zwolnienie
blokad)
Pojęcie monitora doskonale pasuje do pojęcia obiektu
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
9/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Plan
1 Wstęp
2 Monitory
3 Monitory w Javie
4 Wykorzystanie
5 Czytelnicy i pisarze
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
10/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Uboższe (prostsze?) niż teoretyczne
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Uboższe (prostsze?) niż teoretyczne
Konkretnie
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Uboższe (prostsze?) niż teoretyczne
Konkretnie
bloki i metody synchronized
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Uboższe (prostsze?) niż teoretyczne
Konkretnie
bloki i metody synchronized
metody wait, notify notifyAll
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Uboższe (prostsze?) niż teoretyczne
Konkretnie
bloki i metody synchronized
metody wait, notify notifyAll
synchronized dla konkretnego obiektu – wykluczanie
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Uboższe (prostsze?) niż teoretyczne
Konkretnie
bloki i metody synchronized
metody wait, notify notifyAll
synchronized dla konkretnego obiektu – wykluczanie
Tylko jedna zmienna condition
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Uboższe (prostsze?) niż teoretyczne
Konkretnie
bloki i metody synchronized
metody wait, notify notifyAll
synchronized dla konkretnego obiektu – wykluczanie
Tylko jedna zmienna condition
Brak możliwości oczekiwania na konkretny warunek
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Monitory w Javie
Związane z każdym obiektem (Object)
Uboższe (prostsze?) niż teoretyczne
Konkretnie
bloki i metody synchronized
metody wait, notify notifyAll
synchronized dla konkretnego obiektu – wykluczanie
Tylko jedna zmienna condition
Brak możliwości oczekiwania na konkretny warunek
Monitory różnych obiektów są niezależne
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
11/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Plan
1 Wstęp
2 Monitory
3 Monitory w Javie
4 Wykorzystanie
5 Czytelnicy i pisarze
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
12/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Producent – konsument
Producent wytwarza produkt
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
13/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Producent – konsument
Producent wytwarza produkt
Konsument konsumuje produkt
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
13/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Producent – konsument
Producent wytwarza produkt
Konsument konsumuje produkt
Każdy produkt ma być dokładnie raz skonsumowany
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
13/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Producent – konsument
Producent wytwarza produkt
Konsument konsumuje produkt
Każdy produkt ma być dokładnie raz skonsumowany
Może być wielu producentów i konsumentów
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
13/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Producent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Producent extends Thread {
private Bufor bufor ;
Producent ( Bufor b , String name ) {
super ( name );
this . bufor = b ;
setDaemon ( true );
}
public void run () {
int produkt = 0;
while ( true ) {
produkt ++;
try {
sleep (( int )( Math . random ()*100)+100);
} catch ( I n t e r r u p t e d E x c e p t i o n e ){
System . out . println ( " sleep przerwane ! " );
}
System . out . println ( getName ()+ " wyprodukowa ł : " + produkt );
bufor . put ( produkt );
}
}
}
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
14/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Konsument
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Konsument extends Thread {
private Bufor bufor ;
Konsument ( Bufor b , String name ) {
super ( name );
this . bufor = b ;
}
public void run () {
for ( int i = 0; i < 10; i ++) {
try {
sleep (( int )( Math . random ()*100)+100);
} catch ( I n t e r r u p t e d E x c e p t i o n e ){
System . out . println ( " sleep przerwane ! " );
}
int produkt = bufor . get ();
System . out . println ( getName ()+ " skonsumowa ł : " + produkt );
}
}
}
Wojciech Rząsa, KIiA PRz
Implementacja konsumenta
Synchronizacja wątków w języku Java
15/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Interfejs Bufora
1
2
3
4
public interface Bufor {
public void put ( int p );
public int get ();
}
Interfejs bufora danych
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
16/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Uruchomienie
1
2
3
4
5
6
7
public class ProdKons {
public static void main ( String [] args ) {
Bufor bufor = new BuforBasic ();
( new Producent ( bufor , " Producent " )). start ();
( new Konsument ( bufor , " Konsument " )). start ();
}
}
Wykorzystanie producenta i konsumenta
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
17/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor bez synchronizacji (niepoprawny!)
1
2
3
4
5
6
7
8
9
10
11
public class BuforBasic implements Bufor {
private int product ;
public void put ( int p ) {
product = p ;
}
public int get () {
return product ;
}
}
Niepoprawna implementacja bufora (bez synchronizacji)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
18/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Wynik braku synchronizacji
Producent
Konsument
Producent
Konsument
Konsument
Producent
Konsument
Producent
Konsument
Producent
Konsument
Producent
Konsument
Producent
Konsument
Producent
Konsument
Konsument
wyprodukował: 1
skonsumował: 1
wyprodukował: 2
skonsumował: 2
skonsumował: 2
wyprodukował: 3
skonsumował: 3
wyprodukował: 4
skonsumował: 4
wyprodukował: 5
skonsumował: 5
wyprodukował: 6
skonsumował: 6
wyprodukował: 7
skonsumował: 7
wyprodukował: 8
skonsumował: 8
skonsumował: 8
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
19/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Miejsce w buforze
Sprawdzenie, czy bufor
nie jest pełny (producent)
jest niepusty (konsument)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
20/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor z flagą (nadal niepoprawny!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BuforFlag implements Bufor {
private int product ;
private boolean pusty = true ;
public void put ( int p ) {
product = p ;
pusty = false ;
}
public int get () {
pusty = true ;
return product ;
}
}
Niepoprawna implementacja bufora (z flagą pełny/pusty)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
21/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor z flagą (nadal niepoprawny!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BuforFlag implements Bufor {
private int product ;
private boolean pusty = true ;
public void put ( int p ) {
product = p ;
pusty = false ;
}
public int get () {
pusty = true ;
return product ;
}
}
Niepoprawna implementacja bufora (z flagą pełny/pusty)
Wiarygodne wykorzystanie flagi wymaga niepodzielności
operacji!
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
21/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Niepodzielność operacji
Metody synchronized
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
22/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Niepodzielność operacji
Metody synchronized
Tylko jedna metoda synchronized dla obiektu w tym samym
momencie
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
22/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Niepodzielność operacji
Metody synchronized
Tylko jedna metoda synchronized dla obiektu w tym samym
momencie
Definiują sekcję krytyczną dla obiektu
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
22/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor z met. synchronizowanymi (nadal niepoprawny!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BuforSync {
private int product ;
private boolean pusty = true ;
synchronized public void put ( int p ) {
product = p ;
pusty = false ;
}
synchronized public int get () {
pusty = true ;
return product ;
}
}
Niepoprawna implementacja bufora
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
23/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor z met. synchronizowanymi (nadal niepoprawny!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BuforSync {
private int product ;
private boolean pusty = true ;
synchronized public void put ( int p ) {
product = p ;
pusty = false ;
}
synchronized public int get () {
pusty = true ;
return product ;
}
}
Niepoprawna implementacja bufora
Nadal nie sprawdzamy stanu bufora
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
23/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor z met. synchronizowanymi (nadal niepoprawny!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BuforSync {
private int product ;
private boolean pusty = true ;
synchronized public void put ( int p ) {
product = p ;
pusty = false ;
}
synchronized public int get () {
pusty = true ;
return product ;
}
}
Niepoprawna implementacja bufora
Nadal nie sprawdzamy stanu bufora
A co zrobić jeśli stan bufora jest nieodpowiedni?
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
23/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor ze sprawdzaniem warunków i synchronizacją
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BuforWarunki implements Bufor {
private int product ;
private boolean pusty = true ;
synchronized public void put ( int p ) {
while (! pusty ) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
product = p ;
pusty = false ;
notify ();
}
synchronized public int get () {
while ( pusty ) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
pusty = true ;
notify ();
return product ;
}
}
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
24/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor ze sprawdzaniem warunków i synchronizacją
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BuforWarunki implements Bufor {
private int product ;
private boolean pusty = true ;
synchronized public void put ( int p ) {
while (! pusty ) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
product = p ;
pusty = false ;
notify ();
}
synchronized public int get () {
while ( pusty ) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
pusty = true ;
notify ();
return product ;
}
}
Co robi
notify()?
Synchronizacjawarunków
wątków w języku Java
Bufor z synchronizacją i sprawdzaniem
Wojciech Rząsa, KIiA PRz
25/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor ze sprawdzaniem warunków i synchronizacją
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BuforWarunki implements Bufor {
private int product ;
private boolean pusty = true ;
synchronized public void put ( int p ) {
while (! pusty ) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
product = p ;
pusty = false ;
notify ();
}
synchronized public int get () {
while ( pusty ) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
pusty = true ;
notify ();
return product ;
}
}
Co robi
notify()?
A jeśli
będzie
wielu?
Synchronizacjawarunków
wątków w języku Java
Bufor z synchronizacją i sprawdzaniem
Wojciech Rząsa, KIiA PRz
25/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Bufor dla wielu producentów i konsumentów
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class BuforMulti implements Bufor {
private int product ;
private boolean pusty = true ;
synchronized public void put ( int p ) {
while (! pusty ) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
product = p ;
pusty = false ;
notifyAll ();
}
synchronized public int get () {
while ( pusty ) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
pusty = true ;
notifyAll ();
return product ;
}
}
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
26/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Wielu producentów i konsumentów
1
2
3
4
5
6
7
8
9
public class ProdKonsMulti {
public static void main ( String [] args ) {
Bufor bufor = new BuforMulti ();
for ( int i = 1; i < 10; i ++) {
( new Producent ( bufor , " Producent " + i )). start ();
( new Konsument ( bufor , " Konsument " + i )). start ();
}
}
}
Wielu producentów i konsumentów
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
27/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metody notify i notifyAll
Można jedynie obudzić wszystkich, albo którykolwiek
Problem efektywności
Brak kolejki związanej z wait i notify
Mogą być wywołane tylko wewnątrz bloku synchronized
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
28/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metoda wait
Może być wywołane tylko wewnątrz bloku synchronized
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
29/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metoda wait
Może być wywołane tylko wewnątrz bloku synchronized
Powoduje zwolnienie sekcji krytycznej
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
29/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metoda wait
Może być wywołane tylko wewnątrz bloku synchronized
Powoduje zwolnienie sekcji krytycznej
Wiele wątków może czekać na wait (i konkurować ze sobą)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
29/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metoda wait
Może być wywołane tylko wewnątrz bloku synchronized
Powoduje zwolnienie sekcji krytycznej
Wiele wątków może czekać na wait (i konkurować ze sobą)
Możliwe tzw. fałszywe wybudzenia
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
29/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metoda wait
Może być wywołane tylko wewnątrz bloku synchronized
Powoduje zwolnienie sekcji krytycznej
Wiele wątków może czekać na wait (i konkurować ze sobą)
Możliwe tzw. fałszywe wybudzenia
Obsługa InterruptedException
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
29/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metoda wait
Może być wywołane tylko wewnątrz bloku synchronized
Powoduje zwolnienie sekcji krytycznej
Wiele wątków może czekać na wait (i konkurować ze sobą)
Możliwe tzw. fałszywe wybudzenia
Obsługa InterruptedException
Pozwala uniknąć aktywnego oczekiwania
1
while (! pusty ) {}
Pętla aktywnego oczekiwania
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
29/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metoda wait
Może być wywołane tylko wewnątrz bloku synchronized
Powoduje zwolnienie sekcji krytycznej
Wiele wątków może czekać na wait (i konkurować ze sobą)
Możliwe tzw. fałszywe wybudzenia
Obsługa InterruptedException
Pozwala uniknąć aktywnego oczekiwania
1
while (! pusty ) {}
Pętla aktywnego oczekiwania
1
2
3
while (! pusty ) {
Thread . sleep (10);
}
Pętla aktywnego oczekiwania ze sleep
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
29/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metody i bloki synchronized
Metody oznaczone jako synchronized
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
30/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metody i bloki synchronized
Metody oznaczone jako synchronized
Bloki synchronized wywołane na obiekcie
1
2
3
synchronized ( obiekt ) {
// tu instrukcje
}
Blok synchronized
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
30/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metody i bloki synchronized
Metody oznaczone jako synchronized
Bloki synchronized wywołane na obiekcie
1
2
3
synchronized ( obiekt ) {
// tu instrukcje
}
Blok synchronized
Sekcja krytyczna
Wszystkie metody synchronized danego obiektu
Wszystkie bloki synchronized wywołane dla obiektu
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
30/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Metody i bloki synchronized
Metody oznaczone jako synchronized
Bloki synchronized wywołane na obiekcie
1
2
3
synchronized ( obiekt ) {
// tu instrukcje
}
Blok synchronized
Sekcja krytyczna
Wszystkie metody synchronized danego obiektu
Wszystkie bloki synchronized wywołane dla obiektu
Statyczne metody synchronized
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
30/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Synchronizacja w Javie
Sekcje krytyczne: synchronized
Pasywne oczekiwanie: wait
Powiadamianie: notify i notifyAll
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
31/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Synchronizacja w Javie
Sekcje krytyczne: synchronized
Pasywne oczekiwanie: wait
Powiadamianie: notify i notifyAll
Brak możliwości obudzenia wybranych wątków
Brak możliwości czekania na różne warunki wewnątrz jednej
sekcji synchronized
Brak kolejek (wątki współzawodniczą)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
31/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Plan
1 Wstęp
2 Monitory
3 Monitory w Javie
4 Wykorzystanie
5 Czytelnicy i pisarze
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
32/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnicy i pisarze
Czytelnia
Czytelnicy mogą czytać wspólnie
Pisarz wymaga dostępu na wyłączność
Typowy problem informatyczny
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
33/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnik
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Czytelnik extends Thread {
private Czytelnia c ;
Czytelnik ( String name , Czytelnia c ) {
super ( name ); this . c = c ;
}
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( getName () + " chce czyta ć . " );
c . p o c z a t e k C z y t a n i a (); // protok ó ł wst ę pny
try {
System . out . println ( getName () + " czyta . " );
Thread . sleep (( int )( Math . random ()*1000)); // czytanie
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
System . out . println ( getName () + " sko ń czy ł czyta ć . " );
c . koniecCz ytania (); // protok ó ł ko ń cowy
try {
Thread . sleep (( int )( Math . random ()*1000));
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
}
}
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
34/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Pisarz
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Pisarz extends Thread {
private Czytelnia c ;
Pisarz ( String name , Czytelnia c ) {
super ( name ); this . c = c ; setDaemon ( true );
}
public void run () {
for ( int i = 0; i < 10; i ++) {
System . out . println ( getName () + " chce pisa ć . " );
c . p oc za te k Pi sa ni a (); // protok ó ł wst ę pny
try {
System . out . println ( getName () + " pisze . " );
Thread . sleep (( int )( Math . random ()*1000)); // pisanie
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
System . out . println ( getName () + " sko ń czy ł pisa ć . " );
c . koniecPisania (); // protok ó ł ko ń cowy
try {
Thread . sleep (( int )( Math . random ()*1000));
} catch ( I n t e r r u p t e d E x c e p t i o n e ) {}
}
}
}
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
35/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnia
1
2
3
4
5
6
public interface Czytelnia {
public void p o c z a t e k C z y t a n i a ();
public void ko niecCzy tania ();
public void po cz a te kP i sa ni a ();
public void koniecPisania ();
}
Interfejs czytelni
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
36/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Uruchomienie wątków
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CzytPis {
public static void main ( String [] args )
throws I n t e r r u p t e d E x c e p t i o n {
Czytelnia c = new CzytelniaOK ();
for ( int i = 0; i < 10; i ++) {
new Czytelnik ( " Czytelnik " + i , c ). start ();
}
for ( int i = 0; i < 10; i ++) {
new Pisarz ( " Pisarz " + i , c ). start ();
}
}
}
Uruchomienie wątków
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
37/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnia ver. 1 (początek)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class C z y t e l n i a C z y t e l n i k o w implements Czytelnia {
private int czytelnikow = 0;
private int pisarzy = 0;
synchronized public void p o c z a t e k C z y t a n i a () {
while ( pisarzy > 0) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ){}
}
czytelnikow ++;
}
synchronized public void ko niecCzy tania () {
czytelnikow - -;
notifyAll ();
}
/* ... */
Czytelnia (początek)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
38/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnia ver. 1 (koniec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* ... */
synchronized public void po c za te kP i sa ni a () {
while ( czytelnikow > 0 || pisarzy > 0) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ){}
}
pisarzy ++;
}
synchronized public void koniecPisania () {
pisarzy - -;
notifyAll ();
}
}
Czytelnia (koniec)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
39/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Uwagi
Faworyzuje czytelników
Może zagłodzić pisarzy
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
40/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnia ver. 2 (początek)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class C z y t e l n i a P i s a r z y implements Czytelnia {
private int czytelnikow = 0;
private int pisarzy = 0;
private int pisarzy_czeka = 0;
synchronized public void p o c z a t e k C z y t a n i a () {
while ( pisarzy > 0 || pisarzy_czeka > 0) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ){}
}
czytelnikow ++;
}
synchronized public void ko niecCzy tania () {
czytelnikow - -;
notifyAll ();
}
/* ... */
Czytelnia (początek)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
41/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnia ver. 2 (koniec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* ... */
synchronized public void po c za te kP i sa ni a () {
pisarzy_czeka ++;
while ( czytelnikow > 0 || pisarzy > 0) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ){}
}
pisarzy_czeka - -;
pisarzy ++;
}
synchronized public void koniecPisania () {
pisarzy - -;
notifyAll ();
}
}
Czytelnia (koniec)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
42/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Uwagi
Faworyzuje pisarzy
Może zagłodzić czytelników
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
43/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnia ver. 3 (początek)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class CzytelniaOK implements Czytelnia {
private int czytelnikow = 0;
private int pisarzy = 0;
private int pisarzy_czeka = 0;
private boolean k o l e j _ n a _ p i s a r z y = false ;
synchronized public void p o c z a t e k C z y t a n i a () {
while ( pisarzy > 0 || ( pisarzy_czeka > 0 && k o l e j _ n a _ p i s a r z y ))
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ){}
}
k o l e j _ n a _ p i s a rz y = true ;
czytelnikow ++;
}
synchronized public void ko niecCzy tania () {
czytelnikow - -;
notifyAll ();
}
/* ... */
Wojciech Rząsa, KIiA PRz
Czytelnia
(początek)
Synchronizacja wątków w języku Java
44/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Czytelnia ver. 3 (koniec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* ... */
synchronized public void po c za te kP i sa ni a () {
pisarzy_czeka ++;
while ( czytelnikow > 0 || pisarzy > 0) {
try { wait (); }
catch ( I n t e r r u p t e d E x c e p t i o n e ){}
}
pisarzy_czeka - -;
pisarzy ++;
}
synchronized public void koniecPisania () {
k o l e j _ n a _ p i s a rz y = false ;
pisarzy - -;
notifyAll ();
}
}
Czytelnia (koniec)
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
45/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Rozwiązanie poprawne
Daje szansę wejścia pisarzom
Daje szansę wejścia czytelnikom
Nie blokuje czytelników, gdy nie ma pisarzy
Nie blokuje pisarzy, gdy nie ma czytelników
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
46/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Implementacja w Javie
Istnieje coś podobnego do monitora
„Monitor” w Javie nie może mieć wielu zmiennych condition
Nie można budzić osobno czytelników, osobno pisarzy
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
47/48
Wstęp Monitory Monitory w Javie Wykorzystanie Czytelnicy i pisarze
Synchronizacja w Javie
Sekcje krytyczne: synchronized
Pasywne oczekiwanie: wait
Powiadamianie: notify i notifyAll
Warto zobaczyć: java.util.concurrent – inne narzędzia
wspierające współbieżność
Wojciech Rząsa, KIiA PRz
Synchronizacja wątków w języku Java
48/48