Trådar och trådsäkerhet. Objekt-orienterad programmering och design Alex Gerdes, 2018

Relevanta dokument
Trådar. Aktiva objekt

Trådar och trådsäkerhet. Objekt-orienterad programmering och design Alex Gerdes, 2016

Föreläsning 11. Trådar

Föreläsning 14. Trådar. Trådar Trådsäkerhet. Aktiva objekt. Motivering

Föreläsning 11. Trådar Trådsäkerhet

Föreläsning 7. Designmönstret Singleton. Designmönstret State. Trådar

Concurrency Saker händer samtidigt. Process En instans av ett program

Parallellism, återblick

Chapter 4: Writing Classes/ Att skriva egna klasser.

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Tentamen Nätverksprogrammering Lösningsförslag

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Java: kort introduktion. Trådar. Något om mutex, Dekkers algoritm och monitorer. Javas ("inbyggda monitor") synchronized.

Classes och Interfaces, Objects och References, Initialization

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

9 Aktiva objekt och trådar

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Trådar. Motivering. Många program måste kunna hålla på med flera saker samtidigt, till exempel. fleranvändarsystem.

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Enkla variabler kontra referensvariabel

JAVAUTVECKLING LEKTION 4

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

1 Comparator & Comparable

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Mer om klasser och objekt

1.1 Runnable och Thread

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Java TRÅDAR OCH GRAFIK. FAdil galjić

Föreläsnings 9 - Exceptions, I/O

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

PROGRAMMERINGSTEKNIK TIN212

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Tentamen Nätverksprogrammering Lösningsförslag

Objektorienterad Programkonstruktion. Föreläsning dec 2015

Föreläsning 11 Aktiva objekt och trådar, strömmar, kommunikation DAT043,

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

TENTAMEN OOP

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

F4. programmeringsteknik och Matlab

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

DAT043 Objektorienterad Programmering

Laboration 13, Arrayer och objekt

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Lösningsförslag till tentamen

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen ID1004 Objektorienterad programmering May 29, 2012

LÖSNINGSFÖRSLAG

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Kopiering av objekt i Java

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Tentamen EDA698 Realtidssystem (Helsingborg)

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Mutability och State. Objekt-orienterad programmering och design Alex Gerdes, 2018

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Föreläsning 13 Innehåll

Lösningar för tenta 2 DAT043,

Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem).

Malmö högskola 2008/2009 CTS

Att skriva till och läsa från terminalfönstret

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen. Lösningsförslag

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Föreläsning 3. Stack

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Föreläsning 3-4 Innehåll

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

OOP Objekt-orienterad programmering

TENTAMEN OOP

Föreläsning 3: Booleans, if, switch

Transkript:

Trådar och trådsäkerhet Objekt-orienterad programmering och design Alex Gerdes, 2018

Ak#va objekt Det är välkänt från vardagslivet a2 saker händer sam5digt. Det är vik5gt a2 det underliggande systemet stöder parallellism så a2 man kan modellera verkligheten på e2 bra sä2. Det är onaturligt a2 modellera parallellism som e2 sekven5ellt förlopp. I datorer med en processor simuleras parallellismen.

Mo#vering Många program måste kunna hålla på med flera saker sam4digt: bokningssystem av olika slag en webbserver som måste kunna leverera flera webbsidor sam4digt en grafisk applika4on som ritar sam4digt som den arbetar med nästa bild e= grafiskt användargränssni= som u>ör beräkningar och sam4digt är redo a= ha dialog med användaren Denna typ av program kallas samverkande program (concurrent programs). Vi skall här endast ge en introduk4on 4ll programmering med samverkande program, för mer djupgående studier hänvisas 4ll kursen Parallell programmering.

Trådar I Java beskriver man ak.va objekt (och parallellism) med hjälp av standardklassen Thread. Ak.viteter som pågår sam.digt kallas därför i Java för trådar.

Klassen Thread

Trådar I e$ parallellt program beskrivs varje ak3vitet som en instans av klassen Thread. Det tråden skall u:öra definieras genom a$ överskugga metoden run(). public class SupporterThread extends Thread { private String team; public SupporterThread(String team) { this.team = team; public void run() { for (int i = 0; i < 10; i++) { System.out.print(team + " ");

Trådar För a% starta exekveringen av en tråd anropar man metoden start()! Anropas run() direkt skapas ingen tråd. public class WorldCup { public static void main(string[] args) { Thread kallafan = new SupporterThread("Kalla"); Thread wengfan = new SupporterThread("Weng"); kallafan.start(); wengfan.start(); Quiz: vad blir utskri>en?

Icke-determinis-skt beteende Sekven&ella program säges vara determinis)ska vilket betyder a6: Vilka opera&oner som u:örs i programmet är en konsekvens av föregående opera&oner Det är förutsägbart i vilken ordning opera&onerna i e6 sekven&ellt program kommer a6 u:öras Om e6 program körs flera gånger med samma indata kommer samma resultat a6 erhållasvarje gång Program med parallellism uppvisar e6 icke-determinis)skt beteende: I vilken ordning opera&onerna sker mellan de olika programflödena vet vi inte Två programkörningar med samma indata kan ge olika resultat

A" programmera med trådar Mycket komplicerad, bara använd det när det behövs Svårt a: felsöka/avlusa Inte garanterad snabbara än e: sekven@ell program (växla mellan trådar kostar @d) Vi introducera bara bas kunskap, en fortsä:ningskurs behövs

Metoden sleep() En tråd kan temporärt avbryta sin exekvering med metoden sleep(), som är en sta$sk metod i klassen Thread. Metoden sleep() finns i följande två versioner: public static sleep(long mills) throws InterruptedException public static sleep(long mills, int nanos) throws InterruptedException Tiden som man vill avbryta trådens exekvering anges alltså i millisekunder respekave millisekunder och nanosekunder. EDersom sleep() kan kasta en kontrollerad excepaonell händelse måste anropet av metoden ligga i ee try-catch-block.

Exempel På nästa slide har vi skrivit om föregående exempel på så sä8 a8 vi låter tråden sova med e8 slumpmässigt ;dsintervall mellan 0 och 1 sekund mellan varje utskri@. Vi ny8jar också a8 klassen Thread har en konstruktor public Thread(String name) som ger tråden namnet name, samt a8 de8a namn kan avläsas med metoden getname().

Exempel public class SupporterThread extends Thread { public SupporterThread(String team) { super(team); public void run() { for (int i = 1; i <= 10; i++) { System.out.println(i + " " + getname()); try { Thread.sleep((int)(Math.random() * 1000)); catch (InterruptedException e) {

Exempel Vi skriver e) testprogram som innehåller tre objekt av typen SupporterThread: public class WorldCup { public static void main(string[] args) { Thread kallafan = new SupporterThread("Kalla"); Thread wengfan = new SupporterThread("Weng"); Thread holigan = new SupporterThread("Ut med domare!"); En körning kan se ut enligt nedan: 1 Weng 1 Kalla 1 Ut med domare! 2 Kalla 2 Weng 3 Weng 4 Weng 2 Ut med domare! 3 Ut med domare! kallafan.start(); wengfan.start(); holigan.start();

Interfacet Runnable Java %llåter inte mul%pla implementa%onsarv, därför är det omöjligt för en klass som är subklass %ll Thread a; ärva från någon annan klass. Ak%va objekt har många gånger behov av a; ärva från andra klasser. Lösningen är a; använda interfacet Runnable: public interface Runnable { void run(); Interfacet Runnable har endast en metod run() varje klass som implementerar Runnable måste implementera metoden run() metoden run() i klassen som implementerar Runnable är utgångspunkten för exekveringen av en tråd.

Interfacet Runnable E" Runnable-objekt abstraherar begreppet e" jobb (t.ex. e" recept). E" Thread-objekt abstraherar begreppet en arbetare (t.ex. en kock). Hur kan vi associera e" jobb med en arbetare? Genom a" klassen Thread har en konstruktor public Thread(Runnable target) Konstruktorn skapar e" Thread-objekt som när det startas exekverar metoden run() i objekt target. Exempel: Runnable recipe =...; Thread chef = new Thread(recipe); chef.start();

Exempel Runnable Vi skriver en klass Writer som har två instansvariabler text och interval. När e6 objekt av klassen Writer exekveras skall texten text skrivas ut gång på gång med e6 =dsintervall av interval sekunder mellan utskri>erna.

Exempel Runnable public class Writer implements Runnable { private String text; private long interval; public Writer(String text, long time) { this.text = text; interval = time * 1000; public void run() { while (!Thread.interrupted()) { try { Thread.sleep(interval); catch (InterruptedException e) { break; System.out.print(text + " ");

Exempel Runnable För a% demonstrera hur flera objekt av klassen Writer kan exekvera parallellt ges nedan e% program som under en minut skriver ut Kalla" var 3:e sekund, Weng" var 4:e sekund och "Ut med domaren!" var 5:e sekund.

Exempel Runnable public class TestWriter { public static void main(string[] arg) { Thread kallafan = new Thread(new Writer("Kalla", 3)); Thread wengfan = new Thread(new Writer("Weng", 4)); Thread huligan = new Thread(new Writer("Ut med domaren!", 5)); kallafan.start(); wengfan.start(); huligan.start(); try { Thread.sleep(60000); kallafan.interrupt(); wengfan.interrupt(); huligan.interrupt(); catch (InterruptedException e) { Avbryt trådarna e-er 60 sekunder

Exempel Runnable public class TestWriter2 { public static void main(string[] arg) { Thread kallafan = new Thread(new Writer("Kalla", 3)); Thread wengfan = new Thread(new Writer("Weng", 4)); Thread holigan = new Thread(new Writer("Ut med domaren!", 5)); kallafan.setdaemon(true); wengfan.setdaemon(true); holigan.setdaemon(true); kallafan.start(); wengfan.start(); holigan.start(); try { Thread.sleep(60000); catch (InterruptedException e) { Sä# $ll demon-trådar. Dödas av JVM när det inte finns andra icke demontrådar som exekverar.

Vänta på a( tråden skall avsluta Vi utökar vår,digare klass WorldCup enligt: public class WorldCup { public static void main(string[] args) { Thread kallafan = new SupporterThread("Kalla"); Thread wengfan = new SupporterThread("Weng"); Thread holigan = new SupporterThread("Ut med domare!"); kallafan.start(); wengfan.start(); holigan.start(); System.out.println("Storma plan!"); Quiz: När stormas planen?

Vänta på a( tråden skall avsluta För a% vänta på a% en tråd avslutas används metoden join(): public class WorldCup { public static void main(string[] args) { Thread kallafan = new SupporterThread("Kalla"); Thread wengfan = new SupporterThread("Weng"); kallafan.start(); wengfan.start(); try { kallafan.join(); wengfan.join(); catch (InterruptedException e) { System.out.println("Storma plan!");

Trådsäkerhet Då e$ objekt modifieras kan det inta e$ antal 4llfälliga 4llstånd som inte är konsistenta (d.v.s. ogil4ga). Om en tråd avbryts under en modifika4on av e$ objekt, så kan det lämna objektet i e$ ogil4gt 4llstånd. En klass säges vara trådsäker om den garanterar konsistens för sina objekt, även om det finns mul4pla trådar närvarande. tråd 1 tråd 2 avariable = 123; avariable avariable = 45;?????

Kri$ska sek$oner Kodsegment som har access /ll samma objekt från olika separata trådar utgör en s.k. kri$sk sek$on (eng: cri$cal sec$on), och måste synkroniseras på så säa aa endast en tråd i taget får /llgång /ll objektet, annars kan objektet hamna i ea inkonsistent $llstånd.

Kri$ska sek$oner exempel Antag a' vi har en klass för a' handha bankkonton enligt nedan: public class Account { private double balance; //... public boolean withdraw(double amount) { if (amount <= balance) { double newbalance = balance - amount; balance = newbalance; return true; else return false; public void deposite(double amount) { balance = balance + amount; //...

Inkonsistent )llstånd Antag vidare a, balansen på e, konto är 100000 kronor och a, två u,ag görs sam<digt vardera på 100000 kronor. Följande kan hända: E, inkonsistent <llstånd på kontot har inträffat! Balansen borde vara -100000 men är 0! Vi har få, race condi*on. En tråd försöker läsa data medan en annan tråd uppdaterar densamma.

Synkronisering För a% kontot inte skall hamna i e% inkonsistent 1llstånd måste metoden withdraw synkroniseras, dvs endast en tråd i taget skall kunna få 1llgång 1ll metoden. Java's lösning för a% åstadkomma synkronisering: varje objekt definieras som en monitor, vilken har e% singulärt lås för a% en tråd skall få 1llträde 1ll en kri1sk sek1on måste tråden först få 1llgång 1ll låset a% ha 1llgång 1ll låset innebär a% ingen annan tråd kan ha 1llgång 1ll låset låset återlämnas när tråden lämnar den kri1ska sek1onen. Allt de%a görs automa1skt med konstruk1onen synchronized. Programmerarens uppgif är a% iden1fiera de kri1ska sek1onerna.

Synkroniserad version av withdraw public class Account { private double balance; //... public synchronized boolean withdraw(double amount) { if (amount <= balance) { double newbalance = balance - amount; balance = newbalance; return true; else return false; public void deposite(double amount) { balance = balance + amount; //...

Konsistent )llstånd Om vi nu återigen antar a. balansen på kontot är 100000 kronor och a. två u.ag görs sam;digt på 100000 kronor händer följande: Balans Uttag 1 Uttag 2 100000 amount<= balance 100000 newbalance = balance - amount 0 balance = newbalance 0 return true 0 amount<= balance 0 return false

Ömsesidig uteslutning För a% göra klassen Account trådsäker räcker det inte a% enbart metoden withdraw är synkroniserad, utan även metoden deposite måste synkroniseras. De%a på grund av a% båda metoderna konkurrerar om a% förändra >llståndet på variabeln balance.

Ömsesidg uteslutning public class Account { private double balance; //... public synchronized boolean withdraw(double amount) { if (amount <= balance) { double newbalance = balance - amount; balance = newbalance; return true; else return false; public synchronized void deposite(double amount) { balance = balance + amount; //... ac.withdraw stänger ute y2erligare en ac.withdraw ac.withdraw stänger ute ac.deposit ac.deposit stänger ute y2erligare en ac.deposit ac.deposit stänger ute ac.withdraw men ac1.withdraw stänger inte ute ac2.withdraw, etc.

Låset ägs av tråden Låset ägs av tråden, vilket förhindrar a5 en tråd blir blockerad av e5 lås som tråden redan har: public class ChainExample { public synchronized void methoda() { //do something methodb(); //do something more public synchronized void methodb() { //do something I och med a5 tråden är i besi5ning av låset när metoden methoda börjar exekvera och låset släpps först när exekveringen av metoden är klar är tråden i besi5ning av låset när den synkroniserade metoden methodb anropas.

Synkronisering av satser Om alla metoder är synkroniserade i e1 objekt kan endast en tråd åt gången använda objektet. För lite synkronisering konflikter mellan trådar inkonsistens på grund av =llgång =ll samma resurs (race condi=on) För mycket synkronisering trådarna får vänta på varandra, ingen parallellism

Synkronisering av satser Det är möjligt a. synkronisera enskilda satser med konstruk6onen: synchronized (obj) { <statements> där obj är en godtycklig objektreferens. För a. a. kunna exekvera satserna i <statements> måste tråden äga låset 6ll objektet obj. public static void amethod(int[] n) { //... synchronized(n) { for (int = 0; i < n.length; i = i + 1) { if(n[i] > 100) { save(n[i]); //...

Synkronisering av satser Om satser som berör en primi/v variabel skall synkroniseras, associeras den primi/va variabeln med e7 lås-objekt. public class PrimaryTypeSynchronization { private int valuea; private double valueb; private Object locka = new Object(); private Object lockb = new Object(); public void seta(int value) { synchronized(locka) { valuea = value; public double geta() { synchronized(locka) { return valuea; public void setb(double value) { synchronized(lockb) { valueb = value; public double getb() { synchronized(lockb) { return valueb;

Samarbete mellan trådar Synkronisering handlar om uteslutning inte samarbete. Samarbete innebär: vänta: när en tråd inte kan fortsä9a, så låt andra trådar fortsä9a meddela: väck upp sovande trådar om det händer något som dessa kanske väntar på Metoden wait() suspenderar tråden och öppnar låset för objektet andra trådar får möjlighet a9 exekvera synkroniserade metoder tråden väcks när någon tråd anropar notifyall för objektet Metoden notifyall() signalerar Bll andra trådar som väntar på a9 objektet skall vakna Anm: Det finns även en metod notify(), men den bör inte användas.

Live code DivideAndConquer

What s next Block 7-2: Sammanfa0ning och tentameninfo