Avatar billede webster Nybegynder
14. august 2002 - 12:17 Der 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?

void enMetode(Objekt o1, Object o2){
  o1.doSomething(o2);
}

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?

på forhånd tak
Avatar billede carstenknudsen Nybegynder
14. august 2002 - 12:50 #1
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.
Avatar billede webster Nybegynder
14. august 2002 - 22:31 #2
takker, ville lige havde tjekket at jeg ikke var helt galt på den.
Avatar billede webster Nybegynder
14. august 2002 - 22:50 #3
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?)
Avatar billede carstenknudsen Nybegynder
15. august 2002 - 09:51 #4
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester