..
Vi kan tenke på en felles data som alle andre informasjonsbehandling oppgaver å bli utsatt for flere parter. Tenk, for eksempel lagre en tallverdi som representerer euro / dollar. Vi har et program som jevnlig sjekker hva valutakursen og oppdaterer verdien til variabelen. En eller flere andre programmer, men vil bruke den oppdaterte informasjonen til å drive kursen konverteringskurs.
Legg merke til hvordan forvaltningen av et felles, selv i denne enkle eksempel, trenger spesiell oppmerksomhet. Tenk deg for eksempel at mens et program trenger for å lese valutakursen å konvertere, er også mottatt av et annet program, en forespørsel om å endre kursen selv.
Som utføres først? Hvilken valutakurs konvertering er gjort? Problemet, i noen tilfeller litt mer komplisert, kunne bli enda mer alvorlig.
Tenk deg at variable av interesse er ikke elementære, men for eksempel består av et sett med data. Det kan nå utføres bare delvis skrive, og deretter fulgt av en lesning fra ferdigstillelse av skriveprosessen. Transaksjonene vil da bli utført med et sett av verdier endret seg bare delvis, gir opphav til meningsløse resultater og dermed uakseptabelt.
Gitt eksistensen av denne slags problemer mange programmeringsspråk gi spesifikke verktøy for forvaltning av felles variabler. Vi undersøker under særlig med denne kategorien av problemene håndteres i Java programmeringsspråk, en av de mest brukte av alle.
Du må først forstå hvordan vi kan sikre at bare ett program på en gang, eller mer presist bare en tråd av gangen (en tråd er den grunnleggende komponenten i en prosess eller et program, med andre ord et program kan bestå av flere tråder, kjøres samtidig) kan få tilgang til en delt variabel. Mekanismen som tillater oss å tilby denne garantien kalles gjensidig utelukkelse.
Gjensidig utelukkelse
Tenk å utvikle en klasse (eller et sett med data og metoder, som er nyttige funksjoner for å behandle selve dataene) kalt Variabile_Condivisa strukturert som følger:
public class Variabile_Condivisa
{
euro_dollaro float;
euro_sterlina float;
Variabile_Condivisa ()
{
euro_dollaro = 1;
euro_sterlina = 1;
}
set_euro_dollaro void (float e_d) = {euro_dollaro e_d;}
set_euro_sterlina void (float e_s) = {euro_sterlina e_s;}
get_euro_dollaro float () {return euro_dollaro;}
get_euro_sterlina float () {return euro_sterlina;}
}
De to uttalelser, og at euro_dollaro euro_sterlina, representerer valutakurs euro / dollar og euro / pund og at vi ønsker å dele informasjon mellom flere programmer (eller mellom flere tråder).
Metodene er utviklet gjør det mulig å tilordne en verdi til disse dataene (og set_euro_dollaro set_euro_sterlina) og lese disse verdiene (og get_euro_dollaro get_euro_sterlina).
Da kan vi identifisere en bestemt metode (Variabile_Condivisa), som kalles klassen konstruktør blir utført og at etableringen av hver Variabile_Condivisa, i dette tilfellet ved å sette verdiene av variablene og euro_dollaro euro_sterlina er satt til 1.
Da kan vi skape i vårt program en objekttype oppkalt var Variabile_Condivisa (klassen representerer et sett med enheter med felles egenskaper, mens et objekt representerer et spesifikt element i dette settet, som kan refereres til i programmet ) på denne måten:
Variabile_Condivisa Variabile_Condivisa var = new ();Som vi kan nå sikre at det ikke er problemer i forvaltningen av data som deles var? Den Java-språket gir søkeordet (eller søkeord) synkronisert, som aksepterer hvilket som helst objekt som parameter. Gjennom synkroniserte, kan du definere, som vist i eksemplet blokken av koden:
synkronisert (var)
{
/ / Synkronisert blokken med kode avgrenset (var)
}
Før du utfører instruksjonene i synkronisert blokk, får enhver tråd låsen på variabelen var, eller blokkere all videre tilgang til de samme blokk med kode inntil låsen frigjøres, eller til etter å ha kjørt hele blokken eksempel på kode avgrenset av krøllparenteser.
Med andre ord, skaper den første tråden (som vi tenker å ringe først) som utfører synkroniserte uttalelse (var) faktisk en barriere som hindrer noen annen tråd å utføre den synkroniserte uttalelse (var) inntil det første har ikke fullført utførelsen av den synkroniserte blokken med kode avgrenset. I disse blokkene blir deretter satt instruksjonene lese eller skrive felles data.
På denne måten er det garantert gjensidig utelukkelse, som sikrer at bare én tråd om gangen kan få tilgang til en delt variabel. Det bemerkes imidlertid at det er nødvendig å nøye velge objektet som skal sendes som en parameter til synkronisert. Det må være et objekt felles for alle trådene der du vil opprette en mekanisme for gjensidig utelukkelse, for eksempel som i dette tilfellet, variabelen du ønsker å lese eller redigere.
Tenk, på dette punktet, vil du sette vårt program, slik at tråder som ønsker å lese verdien av variabelen var å bli satt på hold og evaluere resultatene bare etter den første oppdateringen etter deres anmodning. Tenk deg at du ønsker å definere en synkronisering mekanisme mellom lesing og skriving.
| |
Linux (Course)
Komplett guide til open-source system. Fra 49 €. |
| |
PHP (Course)
Full kurs for å lage dynamiske nettsider. Fra 49 €. |
| |
Ruby og Ruby on Rails (Course)
Lag programvare og web-applikasjoner med Ruby og RoR. Fra € 39. |