Objektorienterad Programkonstruktion. Föreläsning dec 2015

Relevanta dokument
Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

1.1 Runnable och Thread

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

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

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Lösningsförslag övning 2.

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

Objektorienterad Programkonstruktion. Föreläsning jan 2017

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

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

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

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

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

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

DAT043 - Föreläsning 7

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Kopiering av objekt i Java

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

Föreläsning 5-6 Innehåll

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

Föreläsning 13 Innehåll

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

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

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

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

Laboration 3, uppgift En klass för en räknare

Inledande programmering med C# (1DV402) Tärningarna ska kastas

Objektorienterad programmering i Java

Trådar. Aktiva objekt

Java, klasser, objekt (Skansholm: Kapitel 2)

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

OOP Objekt-orienterad programmering

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

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

Klassdeklaration. Metoddeklaration. Parameteröverföring

Malmö högskola 2007/2008 Teknik och samhälle

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

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

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

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

Klasser som datastrukturer

Laboration 1 - Grunderna för OOP i Java

Exempel: Exempel: Exempel: Exempel: $djur=array("ko","katt","älg"); foreach ($djur as $d) { echo $d. " "; } Resultat. ko katt älg

TDDC77 Objektorienterad Programmering

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Övningar Dag 2 En första klass

Parameteröverföring. Exempel. Exempel. Metodkropp

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

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

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

OOP Objekt-orienterad programmering

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

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Kort om klasser och objekt En introduktion till GUI-programmering i Java

TENTAMEN OOP

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Tentamen i Algoritmer & Datastrukturer i Java

Klasshierarkier - repetition

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

OOP Objekt-orienterad programmering

Introduktion till arv

Classes och Interfaces, Objects och References, Initialization

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

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

Enkla variabler kontra referensvariabel

JAVA Mer om klasser och objektorientering

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

Föreläsning 3-4 Innehåll

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

Realtidssystem. - Dödläge - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 5

Laboration A Objektsamlingar

Transkript:

Objektorienterad Programkonstruktion Föreläsning 12 14 dec 2015

Parallella Problem I program med flera parallella exekveringstrådar kan det uppstå problem, fel och andra fenomen som inte förekommer i enkeltrådade program: Thread interference - två (eller fler) trådar stör varandra Deadlock - två (eller fler) trådar blockerar varandra. Detta feluppstår ofta när man försöker lösa ovanstående fel Starvation - trådar tillbringar all sin tid med att vänta på samma begränsade resurs i stället för at göra nytta Livelock - trådar reagerar på varandras handlingar på ett sätt som skapar nya reaktioner i oändliga loopar

Thread Interference När två trådar arbetar med samma variabel, kan det hända att den ena tråden påbörjar en operation innan den andra är färdig. Om operationernas inbördes ordning spelar roll kommer resultatet att påverkas av hur de olika trådarna har trasslat in sig i varandra, och variera mellan olika körningar. Det är inte alltid uppenbart vilka operationer som kan trassla ihop sig! En operation som alltid körs som en sammanhållen enhet kallas atomic (atomära)

Thread Interference, exempel Antag att det finns en gemensam int i, som två olika trådar har tillgång till Då kan den enkla operationen ++i resultera i interferens Detta beror på att ++i egentligen består av tre steg: 1. Läs i från minnet 2. Öka i med 1 3. Skriv tillbaka värdet till minnet Två trådar (A och B) kan nu göra så här: alternativ 1: alternativ 2: A: läs i (värde 0) A: läs i (värde 0) B: läs i (värde 0) A: öka i (värde 1) A: öka i (värde 1) A: skriv i (värde 1) A: skriv i (värde 1) B: läs i (värde 1) B: öka i (värde 1) B: öka i (värde 2) B: skriv i (värde 1) B: skriv i (värde 2)

Synkronisering För att undvika att två trådar utför olika (eller samma) delar av samma metod samtidigt Man tillåter bara en tråd i taget att anropa en metod Andra trådar som vill anropa metoden ställs på kö tills metoden blir "ledig" I Java åstadkommer man detta med nyckelordet synchronized, tex: public synchronized void incrementcounter(){ counter ++;

Lock Concurrency Pattern Synkroniseringen görs med hjälp av ett så kallat lås (lock) För att kunna anropa en synkroniserad metod måste den anropande tråden ha låset till metodens objekt Låset kan bara innehas av en tråd åt gången, och andra trådar som vill anropa en metod låst med samma lås (dvs i samma objekt) ställs på kö tills låset är ledigt Eftersom varje objekt bara har ett lås, kommer en tråds anrop av en synkroniserad metod att blockera alla andra anrop av denna och andra synkroniserade metoder i detta objekt Eftersom alla synkroniserade metoder i ett objekt är låsta med samma lås, kan en tråd anropa flera olika synkroniserade metoder - den har ju redan låset. Detta kallas reentrant

Exempel public class SynchronizedCounter{ private int counter; public SynchronizedCounter(){ counter = 0; public synchronized void increment(){ counter++; public synchronized void decrement(){ counter ; public synchronized int getvalue(){ return counter;

Synkroniserad Konstruktor? Det går inte att synkronisera konstruktorn Det bör inte behövas, eftersom objektet inte går att referera till förrän konstruktorn har returnerat Man bör dock se till att man inte lämnar ut referenser till objektet (från konstruktorn) innan objektet är färdigt Man vill undvika detta: public MyObject(LinkedList publiclist){ somevariable = Math.random(); publiclist.add(this); othervariable = safevariablegenerator(); I exemplet ovan kan andra trådar hämta instanser av MyObject från publiclist innan värdet på othervariable sätts

Deadlock Betrakta följande kod: public synchronized void syncmethod(){ i++; otherobject.syncmethod(); I exemplet ovan kan ju två trådar samtidigt anropa syncmethod på två olika objekt, och alltså ta låsen i respektive objekt. Anta nu att dessa två objekt finns lagrade som otherobject i varandra. Då kommer båda trådarna att vänta på att den andra ska släppa sitt lås, och de kommer aldrig tills slutet av syncmethod, och släpper aldrig sina lås - detta kallas deadlock

Synkroniserade kodblock Man kan synkronisera en del av ett metodanrop, i stället för hela Detta är viktigt om man anropar metoder från andra objekt inne i metoden man vill synkronisera I Java går det att synkronisera ett begränsat kodblock, med hjälp av synchronized(object lock) lock anger i detta fall vilket objekt som skall tillhandahålla låset, typiskt kan det vara this Vi kan till exempel skriva så här: public void syncmethod(){ synchronized(this){ i++; otherobject.syncmethod(); Nu släpps låset innan vi anropar metoden i otherobject

Olika lås Det går att låsa olika metoder med olika lås, om vi tycker att det är OK om olika trådar anropar dem: public class SynchronizedCounterPair { private long c1 = 0; private long c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Object(); public void inc1() { synchronized(lock1) {c1++; public void inc2() { synchronized(lock2) {c2++;

Starvation Om man har ett vanligt förekommande metodanrop som skyddas av ett lås, kan man riskera att de flesta trådar tillbringar all sin tid med att vänta på lås i stället för att utföra arbete. Programmet låser sig inte, men kan gå väldigt långsamt trots att inga tunga uppifter utförs. Problemet kan lösas genom att stora synkroniserade metoder om möjligt delas upp i flera små, med separata lås.

Livelock Om två trådar reagerar på varandras handlingar kan de också hamna i en evighetsloop. De är inte i deadlock, men de kommer ändå inte vidare. Exempel: tråd A och tråd B försöker båda se till att summan av A.x och B.x är udda: while((this.x + otherobject.x)%2 == 1 ){ this.x++; I detta fall kan vi hamna i ett läge där båda trådarna anpassar sig efter den andra, och aldrig löser problemet, likt två personer som försöker undvika en krock i en korridor men hela tiden kliver åt sidan åt samma håll

Mer Lock i Java Java erbjuder också ett gränsnitt Lock, för låsklasser För dessa kan man prova att ta ett lås, och om det inte går, så kan man släppa låset utan att anropa metoden Detta är lite krångligare än att använda synchronized, och man måste hantera låsen själv explicit Detta kan ge upphov till ytterligare livelock Om man använder try/catch måste man komma ihåg att släppa låset i finally private final Lock mylock = new ReentrantLock();... if(mylock.trylock()){ dosomesynchronizedstuff(); mylock.unlock(); else{ throw(new Exception("Lock was taken!"));

Exempel public class SynchronizedCounter{ private int counter; public SynchronizedCounter(){ counter = 0; public synchronized void increment(){ counter++; public synchronized void decrement(){ counter ; public synchronized int getvalue(){ return counter;

Exempel public class SynchronizedCounter{ private int counter; public SynchronizedCounter(){ counter = 0; public synchronized void increment(){ counter++; public synchronized void decrement(){ counter ; public synchronized int getvalue(){ return counter;