Java spørgsmål vdr. Mutual Exclusion

Tags:    computer-science mutual-exclusion semaphore java

Halløj udviklere.

Jeg står og skal op til min første års eksame imorgen på mit studie, og der er lige noget teory jeg lige skal have styr på, håber i kan hjælpe mig.

Som i kan se i tagsne, er det angående Mutual Exclusion, som betyder at vi ikke vil have flere end 1 process eller thread i en Critical Region, og der derfor ikke opstås Race Conditions. i Java har vi det dejlige Keyword der hedder Synchronized, og så vidt som jeg har forstået kan vi opnå Mutual Exclusion ved hjælp af det.

Men så kommer jeg til Semaphore, Mutex etc. så vidt jeg har læst mig til, gør disse metoder præcis det samme?
Dog har Semaphore den fordel at man kan bestemme hvor mange der må være i den region den beskytter.

Mit spørgmål er altså, Hvad er forskellen på Metoder som Mutex, Semaphores og Synchronized?

På forhånd tak.



2 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 12 karma
Sorter efter stemmer Sorter efter dato
En semaphore "styrer" tilgangen til en delt ressource. Hvis man forstiller sig at en given ressource kan blive benyttet mere end én gang har man en counting semaphore. Count på denne semaphore vil så tælle hvor mange gange ressourcen er blevet "tildelt" en given process.
En binær sempahore, er en semaphore hvor count maksimalt kan være 1. Dette er ækvivalent til Mutual Exclusion.

Typisk hedder metoderne wait (som kaldes inden ressourcen bruges), og signal (når man er færdig med at bruge ressourcen).
Nedenfor er et klassisk eksempel på en "simpel" Semaphore implementering:
<code>
wait(Semaphore s){
while (s==0); /* wait until s>0 */
s=s-1;
}

signal(Semaphore s){
s=s+1;
}

Init(Semaphore s; Int v){
s=v;
}
</code>

Synchronized nøgleordet sikrer at kun én process ad gangen kan udføre koden. Typisk blive dette brugt i metoder som ændrer i globale variabler, for på den måde at undgå race conditions.



Så altså Semaphore til at beskytte ressourcer, og Synchronized til at sørge for at threads ikke fucker f.eks en global counter variable op.



t