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