{ "title": "Kritiske regioner", "exercises": "true", "solutionsLink": "losninger.htm" }
1 Denne opgave tager udgangspunkt i den vejledende løsning til opgave 1 fra kapitlet: "Tråde".
  I klassen TennisSpiller optræder følgende linier mod slutningen:
 
          harBold = false;
          modstander.modtagBold();
        
  Det er ikke uvæsentligt i hvilken rækkefølge disse to linier står. Hvis man i stedet sætter harBold til false efter kaldet af modtagBold, er der en race condition.
  Forklar hvorfor!
   
2 I kapitlet, foretog vi en analyse af Dekker's og Peterson's algoritme. Gennemgå analysen for hver af algoritmerne, idet du anvender følgende tegning, og løbende opdaterer variablene:
 
  F.eks. er følgende start-situationen for Dekker's algoritme:
  Vi har her tegnet en cirkel til højre, der viser om trådene (0 og 1) er indenfor eller udenfor den kritiske region. En sådan cirkel er også nyttig i forbindelse med analysen af Peterson's algoritme.
   
3 Betragt følgende klasse:
 
          public class Lock {
            private final static Thread NONE=null;
          
            private Thread lockOwner;
            
            public Lock() {
              lockOwner = NONE;
            }
            
            public void getLock() {
              while (lockOwner != Thread.currentThread()) {
                if (lockOwner == NONE)
                  lockOwner = Thread.currentThread();
                else
                  Sleeper.nap();
              }
            }
            
            public void releaseLock() {
              if (lockOwner == Thread.currentThread())
                lockOwner = NONE;
            }
          }
        
  Lock-klassen er, ligesom Dekker's og Peterson's algoritmer, et forsøg på at lave en mekanisme, der kan give os mutex.
  Lav en analyse af Lock-klassen, svarende til den der laves i opgave 2.
  [Lock-klassen er en lettere omskrivning af klassen: BusyFlag, fra "Java Threads, 2nd ed.", Scott Oaks og Henry Wong, O'Reilly, 1999, s. 50-51]
   
*4 I denne opgave skal du lave en specifik anvendelse af Producer-Consumer. I forbindelse med modtagelse af data over et netværk, kan man have behov for et buffer-objekt, der kan levere hele linier, selvom teksten evt. bliver sendt i brudstykker over netværket.
  Vi skal naturligvis ikke se på netværks-delen af dette problem, da netværksprogrammering ikke er emnet her, men udelukkende beskæftige os med hvordan en sådan buffer (isoleret set) konstrueres.
   
  Lav en klasse TextBuffer, der anvender en instans af StringBuffer til at opsamle tegn den modtager. Klassen skal have to metoder: readLine og insert.
  readLine skal tage den næste hele linie fra bufferen og returnere denne. Hvis der endnu ikke er en hel linie i bufferen, skal den vente på, at der kommer det. En hel linie er kendetegnet ved, at den afsluttes med linieskift, dvs: "\n". Man kan derfor sige at linieskift tjener som delimiter i bufferen.
  insert skal modtage et enkelt tegn og føje det til bufferen.
   
  Lav to klasser: Producer og Consumer, der fungerer efter det samme design som beskrvet i kapitlet. Producer'en skal sende et tegn af gangen til bufferen, idet den holder en pause mellem hvert tegn på op til 0,2 sekunder. Consumer'en skal hele tiden hente linier fra bufferen og udskrive dem
   
  Lav en testanvendelse, med en Producer, der sender tre linier til bufferen. Husk, at den sidste linie også skal afsluttes med linieskift!
  Vi vil ikke gøre noget særligt ud af terminering af programmet. Lad derfor Consumer-tråden være en daemon-tråd, og lad Producer-tråden holde en pause på 1 sekund før den terminerer, så Consumer-tråden får lejlighed til at tømme bufferen.