Programowanie współbieżne Laboratorium nr 12

Podobne dokumenty
Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Współbieżność w środowisku Java

Programowanie współbieżne Laboratorium nr 11

Wątki w Javie. Piotr Tokarski

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Język Java wątki (streszczenie)

Model pamięci. Rafał Skinderowicz

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Kurs programowania. Wykład 8. Wojciech Macyna

Programowanie obiektowe

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Programowanie obiektowe

Podstawy współbieżności

Język Java wątki (streszczenie)

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Aplikacje w Javie- wykład 11 Wątki-podstawy

Aplikacje w środowisku Java

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wykład 6: Dziedziczenie

Technologie i usługi internetowe cz. 2

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

Programowanie współbieżne Laboratorium nr 14. Synchronizatory

Wykład 8: klasy cz. 4

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie komputerów

Programowanie wielowątkowe. Tomasz Borzyszkowski

Multimedia JAVA. Historia

Wykład 4: Klasy i Metody

Dziedziczenie. dr Jarosław Skaruz

Java: interfejsy i klasy wewnętrzne

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Enkapsulacja, dziedziczenie, polimorfizm

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Współbieżność w Javie

TimeUnit.SECONDS.sleep(1); } } catch (InterruptedException e) { System.out.println("INTERRUPT " + System.nanoTime() + " " + isinterrupted()); }

Model pamięci. Rafał Skinderowicz

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Platformy Programistyczne Podstawy języka Java

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie obiektowe

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie wielowątkowe: podstawowe koncepcje, narzędzia w Javie. J. Starzyński, JiMP2, rok akad. 2005/2006

Java Język programowania

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Dokumentacja do API Javy.

Programowanie obiektowe

1 Atrybuty i metody klasowe

Aplikacje w środowisku Java

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

Polimorfizm. dr Jarosław Skaruz

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Współbieżność w Javie

Java. Programowanie Obiektowe Mateusz Cicheński

Nazwa Wydziału Nazwa jednostki prowadzącej moduł Nazwa modułu kształcenia Kod modułu Język kształcenia Efekty kształcenia dla modułu kształcenia

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Definiowanie własnych klas

Wykład 7: Pakiety i Interfejsy

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Programowanie, część I

Programowanie obiektowe

2. Składnia, środowisko i konwencje w Javie

Programowanie obiektowe

Tworzenie aplikacji w języku Java

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podstawy Języka Java

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe i zdarzeniowe

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Wstęp do programowania obiektowego. Wykład 2

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Rozdział 4 KLASY, OBIEKTY, METODY

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Programowanie współbieżne Wykład 2. Rafał Skinderowicz

Język C++ zajęcia nr 2

Transkrypt:

Programowanie współbieżne Laboratorium nr 12 Uwaga!!! Wyniki uruchomionych programów mogą zależeć od sprzętu (ilość procesorów, rdzeni itp.), systemu operacyjnego, obciążenia systemu operacyjnego, ilości wątków w programie (zmienna SIZE), wersji maszyny wirtualnej Javy, itp. Atomowość (...) operacja atomowa (inaczej: niepodzielna ) [4] to czynność, której mechanizm zarządzania wątkami nie jest w stanie przerwać - jeśli operacja się rozpocznie, będzie wykonywana aż do zakończenia, a dopiero potem pojawi się możliwość zmiany kontekstu. Widoczność W systemach wieloprocesorowych [4] (...) do aspektów atomowości dochodzi kwestia widoczności, znacznie bardziej tu eksponowana niż w systemach jednoprocesorowych. Otóż zmiany wprowadzane przez jedno zadanie, nawet jeśli są atomowe w sensie niepodzielności, mogą być niewidoczne dla innych zadań (zmiany mogą się na przykład odbywać w lokalnej pamięci podręcznej procesora), przez co różne zadania będą różnie postrzegać stan aplikacji. Synchronizacja (...) mechanizm synchronizacji wymusza [4], aby zmiany wprowadzone przez zadanie w systemie wieloprocesorowy były widoczne dla wszystkich współbieżnych zadań aplikacji. Bez synchronizacji nie sposób określić momentu uwidocznienia zmiany. Pola volatile Pole z modyfikatorem volatile [1] wskazuje kompilatorowi i systemowi wykonawczemu, że zmienna jest współdzielona i wykonywanych na niej operacji w pamięci nie należy układać w innej kolejności niż wskazana w kodzie źródłowym. Zmienne ulotne nie są przechowywane ani w buforach, gdy są ukryte przed innymi procesorami. Czy usunięcie modyfikatorów volatile z definicji zmiennych i oraz j zmienia coś w działaniu programu? public class TestVolatile { Test.one();.start(); Test.two();.start(); private static class Test { private volatile static int i = 0; private volatile static int j = 0; private static void one() { i++; j++;

private static void two() { int tmpi = i; int tmpj = j; System.out.println("" + tmpi + ";" + tmpj); if (tmpi > tmpj + 1) Gdy wątek odczytuje zmienną bez synchronizacji [1], może widzieć nieświeżą wartość, ale przynajmniej jest to wartość umieszczona tam przez inny watek, a nie jakaś losowa wartość. Mówi się w takiej sytuacji o bezpieczeństwie poprawności. To bezpieczeństwo dotyczy wszystkich zmiennych poza jednym wyjątkiem - 64-bitowych zmiennych liczbowych (double i long) niezadeklarowanych jako volatile (...). Model pamięci Javy wymaga, by operacje pobierania i zapamiętywania były niepodzielne, ale dla nieulotnych zmiennych long i double maszyna wirtualna może potraktować odczyt i zapis 64-bitowy jako dwie operacje 32-bitowe. Jeżeli zapis i odczyt takiej nieulotnej zmiennej odbywa się w dwóch różnych wątkach, wątek odczytujący może przeczytać niższe 32 bity nowej wartości i wyższe 32 bity starej. Czy usunięcie modyfikatorów volatile z definicji zmiennej i zmienia coś w działaniu programu? public class TestLongVolatile { TestLong.write();.start(); TestLong.read();.start(); private static class TestLong { static volatile long i = 0; public static void write() { long tmp = i & 0xFFFFFFFFL; tmp++; i = tmp (tmp << 32); public static void read() { long tmp = i; long l = tmp & 0xFFFFFFFFL; long h = tmp >>> 32; if (l!= h) { System.err.println("!" + Long.toHexString(tmp) + " : " + h + "!= " + l); System.exit(0);

Synchronizacja Java [1] ma wbudowany mechanizm blokad zapewniający niepodzielność: blok synchronized (...). Blok synchronized składa się z dwóch części: referencji do obiektu, który służy jako blokada, oraz blok kodu chroniony przez blokadę. Metoda synchronizowana to skrótowa wersja bloku synchronized obejmująca całe ciało metody. Właściwą blokadą jest wtedy obiekt, na rzecz, którego została wywołana metoda. Statyczne metody sychronizowane używają obiektu Class do zapewnienia blokady. W których miejscach należy usunąć komentarz (lub komentarze), żeby program działał poprawnie? public class Test extends Thread { final private static int SIZE = 4; static MyObject value = new MyObject(); int i; { i = value.method(); switch (i) { case 0: case 1: break; default: System.err.println("ERROR " + i); Test[] t = new Test[SIZE]; for (int i = 0; i < SIZE; i++) { t[i] = new Test(); t[i].start(); class MyObject { private int i = 0; /* synchronized */public int method() { if (i == 0) return ++i; if (i == 1) return --i; return i;

Pola finalne Pól finalnych (ostatecznych) nie można modyfikować (choć obiekty, do których zawierają referencje, mogą się zmieniać). Co więcej, mają one specjalne znaczenie w modelu pamięci Javy. To użycie pól finalnych gwarantuje bezpieczeństwo inicjalizacyjne (...), które umożliwia swobodny dostęp i współdzielenie obiektów niezmiennych. Obiekty niezmienne Obiekty niezmienne [5] są ze swojej natury bezpieczne dla wątków - nie wymagają synchronizacji. Nie mogą zostać uszkodzone przez wiele wątków, odwołujących się do nich równolegle. Obiekt jest niezmienny, jeżeli [1]: - jego stanu nie można zmienić po zakończeniu działania konstruktora, - wszystkie jego pola są typu final, - jest poprawnie utworzony (referencja this nie ucieknie w trakcie konstrukcji). Klasa niezmienna [5] to klasa, której obiekty nie mogą być modyfikowane. Wszystkie dane zawarte w każdym obiekcie tej klasy są podawane w czasie tworzenia obiektu i pozostają niezmienne przez cały czas istnienia tego obiektu. (...) Aby utworzyć klasę niezmienną należy pamiętać o pięciu regułach [5]: 1. Nie twórz żadnych metod modyfikujących obiekt. 2. Upewnij się, że żadna metoda nie może zostać przesłonięta. 3. Zadeklaruj wszystkie pola jako final. 4. Zadeklaruj wszystkie pola jako private. 5. Zapewnij wyłączny dostęp do dowolnych modyfikowanych komponentów. public class Vector { final private int x, y, z; final public static Vector UNIT_VECTOR_X = new Vector(1, 0, 0); final public static Vector UNIT_VECTOR_Y = new Vector(0, 1, 0); final public static Vector UNIT_VECTOR_Z = new Vector(0, 0, 1); private Vector(int x, int y, int z) { this.x = x; this.y = y; this.z = z; public Vector newinstance(int x, int y, int z) { if (x == 1 && y == 0 && z == 0) return UNIT_VECTOR_X; if (x == 0 && y == 1 && z == 0) return UNIT_VECTOR_Y; if (x == 0 && y == 0 && z == 1) return UNIT_VECTOR_Z; return new Vector(x, y, z); public int getx() { return x; public int gety() { return y; public int getz() { return z;

public Vector add(vector v) { return new Vector(this.x + v.x, this.y + v.y, this.z + v.z); W rzeczywistej implementacji najlepiej: - dodać metody implementujące inne operacje na wektorach np. minus(vector v), - przesłonić metody tostring(), hashcode(), equals(object o), - zaimplementować interfejs Comparable<Vector>. Publikacja obiektu Aby bezpiecznie opublikować obiekt [1], zarówno referencje do obiektu, jak i jego stan muszą być widoczne dla innych wątków dokładnie w tym samym momencie. Poprawnie skonstruowany obiekt bezpiecznie publikuj przez: - inicjalizacja referencji do obiektu z poziomu elementu static, - przechowywanie referencji w polu volatile lub obiekcie AtomicRefence, - przechowywanie referencji w polu final poprawnie utworzonego obiektu, - przechowywanie referencji w polu poprawnie chronionym blokadą. Czy poniższy przykład zapewnia bezpieczną publikację [1]? public Holder holder;... public void initialze(){ holder = new Holder(42); Jeżeli obiekt może zmieniać się po utworzeniu [1], bezpieczna publikacja zapewnia jedynie jego widoczność w stanie z momentu publikacji. Synchronizację trzeba wtedy stosować nie tylko w momencie publikacji obiektu, ale również przy każdym dostępie do niego, by w ten sposób zapewnić widoczność kolejnych zmian. Klasa Object public final void wait() wątek zostaje zatrzymany, aż do wywołania metody notify() lub notifyall(), istnieją także przesłonięte wersje tej metody ograniczające maksymalny czas czekania (public final void wait(long timeout)) oraz public final void wait(long timeout, int nanos))), public final void notify() oraz public public final void notifyall(), budzi wątek (lub wątki) czekające na monitorze obiektu. Czy umieszczenie pętli wewnątrz bloku synchronizowanego w zmienia coś w działaniu programu? class Buffer { int value; class ReaderThread extends Thread { final private Buffer b; ReaderThread(Buffer b) { this.b = b;

try { { synchronized (b) { System.err.println(">"); b.wait(); System.err.println(">> ReaderThread " + b.value); b.notify(); System.err.println(">>>"); catch (InterruptedException e) { e.printstacktrace(); class WriterThread extends Thread { final private Buffer b; private int i = 0; WriterThread(Buffer b) { this.b = b; try { { synchronized (b) { int t = ++i; b.value = t; Thread.sleep(t); System.err.println("< WriterThread " + b.value); b.notify(); System.err.println("<<"); b.wait(); System.err.println("<<<"); catch (InterruptedException e) { e.printstacktrace(); public class Test extends Thread { Buffer buffer = new Buffer(); WriterThread writer = new WriterThread(buffer); ReaderThread reader = new ReaderThread(buffer); reader.start(); writer.start();

Przykładowa treść laboratorium: 1. Stworzyć niezmienną klasę opisującą figurę geometryczną (np. prostokąt) zawierająca informacje o położeniu figury i jej wymiarach. Klasa powinna umożliwiać wykonywanie następujących operacji: obracania (o wielokrotność 90 o ), rozciągania oraz przesuwania figury. Opracować program testujący użycie stworzonej klasy. 2. Stworzyć program zawierający minimalnie dwa wątki, które będą odczytywać i zapisywać współdzieloną zmienną typu long. Dostęp do zmiennej powinien być zrealizowany wykorzystując: - modyfikator volatile, - blok lub bloki synchronizowane, - metodę lub metody synchronizowane, - metody wait() oraz notify() klasy Object. Literatura: [1] Goetz B., Peierls T., Bloch J., Bowbeer J., Holmes D., Lea D., Java Współbieżność dla praktyków, Helion 2007 [2] Horstmann C.S., Cornell G., Java Podstawy, Helion, Wyd. VIII, 2009 [3] Horstmann C.S., Cornell G., Java Techniki zaawansowane, Helion, Wyd. VIII, 2009 [4] Eckel B.: Thinking in Java, Wyd. IV, Helion, 2006. [5] Bloch J.: Java Efektywne programowanie, Wyd. II, Helion, 2009. [6] Brackeen D., B. Barker, L. Vanhelsuwe: Java Tworzenie gier, Helion, 2004. [7] Silberschatz A., Galvin P. B., Gagne G.: Podstawy systemów operacyjnych, WNT, 2005 [8] Dokumentacja JavaDoc 1.6 htp://java.sun.com [9] Dokumentacja JavaDoc 1.7 htp://java.sun.com [10] The Java Language Specification, Third Edition, http://java.sun.com/docs/books/jls/download/langspec-3.0.pdf