Wydział Fizyki i Informatyki Stosowanej, Uniwersytetu Łódzkiego 03.12.2010 Łódź Java podstawy języka, wykład 4 1
Stosując blokady (synchronizację) Można doprowadzić do zablokowania wszystkich wątków Zakleszczenie (deadlock), blokada wzajemna Klasyczny przykład Problem Ucztujących Filozofów (E. Dijkstra) Java podstawy języka, wykład 4 2
Filozof Myśli lub je do jedzenia potrzebuje dwu sztućców (widelce) 5-ciu filozofów F Filozofowie są biedni więc tylko 5 sztućców W F Siedzą przy okrągłym stole Filozof najpierw podnosi W widelec po lewej stronie potem po prawej F W W W F F Java podstawy języka, wykład 4 3
Program może się zablokować jeżeli 1. Wzajemne wykluczanie przy dostępie do wspólnego zasobu 2. Przynajmniej jeden wątek posiada zasób (blokuje go) i oczekuje na inny zasób 3. Nie ma możliwości wywłaszczania zasobów, sam wątek musi się zrzec zasobu 4. Możliwość zapętlonego oczekiwania Muszą być spełnione wszystkie te warunki jednocześnie! Java podstawy języka, wykład 4 4
Wystarczy nie spełnić choć jednego z warunków Np. Odwrócić ostatniego filozofa Bierze widelce w odwrotnej kolejności Oczekując zwalniać zasoby np. wykorzystać metody wait() i notify() Java nie posiada narzędzi chroniących przed takim przypadkiem Java podstawy języka, wykład 4 5
Trudno wyszukać błędy Dostęp do zasobów Zakleszczenie Problemy z Testowaniem Błąd może występować bardzo rzadko Poprawa Błędów Drobne Korekty Zaprojektowanie programu od nowa Najlepiej unikać przy projektowaniu Java podstawy języka, wykład 4 6
Wykonywanie wiele czynności jednocześnie Zadania mogą na siebie wpływać Potrzebna dobra diagnoza potencjalnych luk i błędów Zły projekt prowadzi do problemów BARDZO TRUDNYCH DO WYKRYCIA Klientowi nie działa a u nasz przy wszystkich testach jest ok. Java podstawy języka, wykład 4 7
Zalety Lepsze wykorzystanie sprzętu Czytelność kodu Wygodny Interfejs Użytkownika Wady Spowolnienie przy obsłudze wątków i synchronizacji Wzrost złożoności projektu Patologie (jednoczesna zmiana zasobów, zakleszczenie ) Różnice pomiędzy platformami Java podstawy języka, wykład 4 8
Przechowywanie Obiektów Pojedynczo W Tablicach Ustalony rozmiar Taki sam dostęp do wszystkich obiektów Kontenery Elastyczny rozmiar Wiele wersji = wiele zastosowań Java podstawy języka, wykład 4 9
Java 4 Omawiane na tym wykładzie Standard na telefony komór kowe Java 5 Wielkie zmiany Typy uogólnione Kompatybilność wstecz Java podstawy języka, wykład 4 10
źródło: Thinking in Java ed. 3. Java podstawy języka, wykład 4 11
Lista List (interfejs) ArrayList LinkedList Zbiory Set (interfejs) TreeSet HashSet LinkedHashSet - szybki dostęp, wolne dodawanie i zmiany - zoptymalizowany dostęp sekwencyjny - uszeregowany zbiór - zoptymalizowane wyszukiwanie - połączenie powyższych Java podstawy języka, wykład 4 12
Odwzorowania (Mapy) Map (interfejs) HashMap LinkedHashMap TreeMap WeakHashMap IdentityHashMap - stały czas dostępu - to samo plus zachowanie kolejności - uszeregowany zbiór - możliwa współpraca z Garbage Collector - jak HashMap ale inaczej porównuje Java podstawy języka, wykład 4 13
Dodawanie elementów add(object) put(object, Object) Pobieranie elementów z kontenera get(int) get(object) Wykorzystanie Iteratorów poruszanie się po kontenerze next( ) - pobieranie następnego elemetu hasnext() Java podstawy języka, wykład 4 14
Tablica indeksowany zbór elementów Ustalony rozmiar (przy inicjalizacji) JVM kontroluje przekroczenie zakresu RuntimeException Stały czas dostępu do wszystkich elementów Dodatkowe metody i pola.length.clone(),.equals().tostring() Java podstawy języka, wykład 4 15
java.util.arrays przydatne metody.binarysearch().fill().sort().aslist() Przyklad4_1 Java podstawy języka, wykład 4 16
Listy (podstawowe własności) Zmienny rozmiar Nieokreślony typ danych metody i pola add() get() size() Java podstawy języka, wykład 4 17
Listy (podstawowe typy) ArrayList rozszerzalna tablica LinkedList Stos, kolejka addfirst(), addlast() getfirst(), getlast() removefirst(), removelast() Java podstawy języka, wykład 4 18
Interfejs pomocniczy dla Kontenerów Obiekt pośredniczący metody hasnext() next() remove() Przykład4_2 Java podstawy języka, wykład 4 19
Implementacja pojęcia zbioru Nieokreślony rozmiar Elementy są unikatowe nie przyjmie ponownie tego samego obiektu Kolejność ma mniejsze znaczenie Brak metody get() LinkedHashSet, TreeSet metoda contains() Przykład4_3 Java podstawy języka, wykład 4 20
Odwzorowanie tablica asocjacyjna Dwa elementy Klucz = Wartość Klucz musi być unikatowy Przykład4_4 Java podstawy języka, wykład 4 21
Kontener nie może zawierać typów podstawowych int, float, double, boolean, Typy Opakowujące (Wrappers) Integer, Float, Double, Boolean, Obiekty dowolnych klas Kontenery typu Hash używają metody hashcode(), equals() Ich brak może powodować problemy Przykład4_5 Java podstawy języka, wykład 4 22
hashcode() Nie musi być unikatowa Nie może zależeć od momentu wywołania Taka sama dla identycznych obiektów Standardowo w Javie hashcode() <-> adres obiektu equals(object) Standardowo equals(object) porównanie adresów Java podstawy języka, wykład 4 23
Dowolny obiekt Przeładowanie metod hashcode() equals() Bez tego całkiem inne działanie Przykład4_6 Java podstawy języka, wykład 4 24
Java 5 = dużo nowych elementów Kontener Można definiować typ danych Przyklad4_7 Java podstawy języka, wykład 4 25
RTTI (Run-time type information) Identyfikacja typu w trakcie wykonywania Dwa podejścia Tradycyjne RTTI Refleksja Po co nam RTTI Jak po użyciu polimorfizmu określić pierwotny typ obiektu? Java podstawy języka, wykład 4 26
Dla każdej klasy programu Istnieje obiekt Class Tworzony przy kompilacji Znajduje się wewnątrz pliku.class Tradycyjne RTTI wykorzystanie obiektu Class Przykład4_8 Literały klas NazwaKlasy.class Java podstawy języka, wykład 4 27
Polimorfizm Przykład4_9 Rzutowanie Kompilator sprawdza czy można rzutować, inaczej wyrzuci wyjątek instanceof Bezpieczne rzutowanie Przykład4_10 Sprawdzanie typu w trakcie wykonywania Literał.isInstance() Przykład4_11 Java podstawy języka, wykład 4 28
Obiektowość Kapsułkowanie (enkapsulacja) Poziomy dostępu private, protected RTTI Złamanie tego paradygmatu Przyklad4_12 setaccessible(boolean) Java podstawy języka, wykład 4 29