14. august 2002 - 12:17Der er
3 kommentarer og 1 løsning
spg. til synchronisering
hejsa. jeg har haft nogle problemer med tilsyneladende at bruge synchronize keywordet forkert/for tit, så vil lige høre om nogen her vil tage et kig på nedenstående fiktive eksempler og sige om min vurdering af om de er threadsafe er korrekt? Hvis jeg har forstået rigtigt så bliver parametrerne i alle kald til en metode lagt på stacken således at nedenstående metode faktisk er thread safe?
int add(int n1, int n2){ return n1 + n2; }
Hvis ovenstående er threadsikkert (altså kan bruges i et program hvor flere tråde vil kalde metoden muligvis på samme tid) er nedenstående så også det?
ville en metode som nedenstående være sikker? (hvor minResource er det eneste "fælles" resource)
void checkForSomething(String cmd){ if (cmd.equals("...")) doblabla; else if(cmd.....) minResource.findEtEllerAndet(cmd); //hvor den metode så er synchroniseret }
altså grundlæggende, har jeg forstået det rigtigt når jeg siger at hver "metode-kald-instance" får sit eget sæt parametrer at arbejde med sådan at sådanne metoder egentligt ikke behøver at synchroniserer?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Synkroniseringsproblemer har at gøre med at flere tråde forsøger at ændre noget "samtidigt". I dit første eksempel er der ingen instans eller klasse varible der bliver berørt, der er kun parametre, så den er sikker. I dit andet eksempel ser det ikke ud til at o1 og o2 er variable i klassen, så det burde også være i orden. Hvis de bliver kaldt internt i klassen med o1 og o2 der er instans eller klasse variable så skal den erklæres synchronized. I det sidste tilfælde er minResource en instans eller klassevaribel og derfor kan der ske ændringer, men hvis metoder er erklæret synchronized (og det skriver du) så skulle også denne være trådsikker. Det ser ud som om alle dine eksempler er trådsikre, med de forbehold jeg har angivet ovenfor.
en ting jeg kom til at tænke på. Er det at assigne noget til en variabel en operation der kræver synkronisering? hvad vil der ske hvis 2 forskellige tråde forsøger at assigne noget til en variabel på samme tid, eller en forsøger at skrive og en forsøger at læse? (ud over at der kan komme en besynderlig opførsel ud af det, vil programmet så crashe eller?)
Det er et godt spørgsmål. Hvis det er en long eller double så skal du i princippet synkronisere da der kun arbejdes med 32 bit ad gangen, og de fylder 64 bit. Hvis du tænker på en reference til et objekt ved jeg det faktisk ikke, det kommer vel an på hvor meget plads en reference benytter, og det ved jeg ikke hvor er specificeret. Specifikationen af JVM arbejder med ord (word) der kan være 32 eller 64 bit, men det er implementeringsafhængigt, så man må formode at på en 64 bit arkitektur vil double og long ikke behøve synkronisering. Det er nok bedst at synkronisere hvis du mener det kunne være et problem.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.