Presentation laddar. Vänta.

Presentation laddar. Vänta.

Jonny Karlsson 19.2.2009 PROCESSPROGRAMMERING Föreläsning 4 (26.2.2009)‏ Innehåll:Trådsäkerhet - Intrinsic locks och synkronisering - Synchronized statements.

Liknande presentationer


En presentation över ämnet: "Jonny Karlsson 19.2.2009 PROCESSPROGRAMMERING Föreläsning 4 (26.2.2009)‏ Innehåll:Trådsäkerhet - Intrinsic locks och synkronisering - Synchronized statements."— Presentationens avskrift:

1 Jonny Karlsson 19.2.2009 PROCESSPROGRAMMERING Föreläsning 4 (26.2.2009)‏ Innehåll:Trådsäkerhet - Intrinsic locks och synkronisering - Synchronized statements - Liveness

2 Jonny Karlsson 19.2.2009 Intrinsic Locks och synkronisering Synkroniseringen är byggd runt en intern enhet som på engelska kallas för intrinsic lock eller monitor lock Varje objekt är associerat med ett intrinsic lock Varje tråd som vill komma åt ett objekts attribut måste komma över ett objekts intrinsic lock innan attributet är åtkomligt När tråden är klar måste den ”lösgöra” låset Så länge som en tråd ”äger” ett intrinsic lås kan ingen annan tråd komma över samma lås. Den andra tråden kommer att blockeras när den försöker komma över låset

3 Jonny Karlsson 19.2.2009 Intrinsic Locks och synkronisering När en tråd anropar en synkroniserad metod tar den automatiskt över intrinsic låset för metodens objekt och lösgör låset när metoden returnerar (eller avslutas på annat sätt)‏ Vad händer då i följande fall??? Kan b manipuleras samtidigt som a inkrementeras? class variabler { int a, b; synchronized inkrementera()‏ {a++;}}

4 Jonny Karlsson 19.2.2009 Intrinsic Locks och synkronisering Vad händer då om statisk synkroniserad metod anropas??? En statisk metod är ju associerad med en klass och inte med ett objekt!! I detta fall tar en tråd vid metodanropet över låset för klassobjektet associerat med klassen, m.a.o. åtkomst till en klass' statiska fält kontolleras av ett lås som är frånskilt från de lås som är associerade med instanser/objekt av klassen.

5 Jonny Karlsson 19.2.2009 Synchronized Statements Ett annat sätt att skapa synkroniserad kod är att använda synchronized statements Synchronized statements måste specificera det objekt som tillhandahåller intrinsic låset. public void addName(String name) { synchronized(this) synchronized(this) { lastName = name; lastName = name; nameCount++; nameCount++; } nameList.add(name); nameList.add(name);}

6 Jonny Karlsson 19.2.2009 Synchronized Statements I exemplet måste addName metoden synkronisera uppdateringar av lastName och nameCount men måste samtidigt undvika synkronisering av anrop av andra objekts metoder. Att anropa metoder ur andra objekt från synkroniserad kod kan ställa till problem (vi tittar närmare på detta lite senare)‏ Synchronized statements är också väldigt nyttiga om vi behöver synkronisera flera fält inom ett objekt som är oberoende av varandra Alla fält måste synkroniseras men det finns ingen orsak att hindra uppdatering av alla andra fält när ett fält uppdateras

7 Jonny Karlsson 19.2.2009 Synchronized Statements public class MsLunch { private long c1 = 0; private long c1 = 0; private long c2 = 0; private long c2 = 0; private Object lock1 = new Object(); private Object lock1 = new Object(); private Object lock2 = new Object(); private Object lock2 = new Object(); public void inc1() { public void inc1() { synchronized(lock1) { synchronized(lock1) { c1++; c1++; } } public void inc2() { public void inc2() { synchronized(lock2) { synchronized(lock2) { c2++; c2++; } }}

8 Jonny Karlsson 19.2.2009 Synchronized Statements I exemplet på föregående sida måste åtkomst av två attribut c1 och c2 synkroniseras c1 och c2 används aldrig tillsammans så det finns ingen orsak t.ex. att hindra att ingen annan tråd kan uppdatera c1 medan c2 håller på och uppdateras Vi kan då skapa två objekt av Object-klassen som vi ger som parameter til synchronzied På så så vis får vi uppdateringen av c1 och c2 relaterade till olika objekt även om c1 och c2 hör till samma objekt Detta gör parallelisering mycke smidigare eftersom vi undviker onödig blockering!!!

9 Jonny Karlsson 19.2.2009 Liveness Med ”liveness” menas en parallellexekverande applikations förmåga att exekvera lägligt. De vanligaste ”Liveness” problemen som kan uppstå är: Deadlock Två trådar är blockerade för evigt i väntan på varandra Två trådar är blockerade för evigt i väntan på varandraStarvation En tråd som inte kan processera eftersom en annan tråd ”tar för lång tid på sej” vid hantering av en delad resurs En tråd som inte kan processera eftersom en annan tråd ”tar för lång tid på sej” vid hantering av en delad resursLivelock I princip samma som deadlock fast tvärtom dvs. två trådar som ”väcker upp” varandra konstant hela tiden och kan därför inte processera normalt I princip samma som deadlock fast tvärtom dvs. två trådar som ”väcker upp” varandra konstant hela tiden och kan därför inte processera normalt

10 Jonny Karlsson 19.2.2009 Deadlock Det klassiska exemplet att beskriva en Deadlock situation är ”de två bugande kompisarna” Två kompisar har infört en god sed att när kompis A bugar åt kompis B slutar A inte buga innan B har bugat tillbaka. Men vad händer om båda bugar exakt samtidigt??!!? - JO! bägge lämnar och buga förevigt eftersom de båda väntar på att den andra skall buga tillbaka! Följande programkod simulerar detta exempel: http://www.sit.fi/~karlssoj/procprog/exempel7.txt


Ladda ner ppt "Jonny Karlsson 19.2.2009 PROCESSPROGRAMMERING Föreläsning 4 (26.2.2009)‏ Innehåll:Trådsäkerhet - Intrinsic locks och synkronisering - Synchronized statements."

Liknande presentationer


Google-annonser