02. juli 2004 - 14:08Der er
7 kommentarer og 1 løsning
Best practice ved brug af synchronized
Hej gutter, jeg har engang læst, at den bedste måde at synchronisere på var som følger:
String static toSynch = "toSynch";
public void write(){
synchronized(toSynch){ // synchronized code } }
Og at følgende ikke er en god løsning:
public synchronized void write(){
// synchronized code }
Kan ikke helt huske hvorfor, men det var vist noget med, at synchroniserings erklæringen i metoden ikke gjorde metoden helt beskyttet alligevel. Hvad siger I ?
30 stærke til gode meninger og bud i brugen af best practice mht. synchronized statement i java.
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.
Der er ikke noget forkert ved at bruge synchronized på metoder.
Man skal kun bruge et synch objekt hvis man skal lave en synch mellem alle instanser i en ikke static metode.
Hvis det er en meget lang metode kan der muligvis være nogle performance mæssige fordele ved kun at synche en lille del af koden med en synch variabel fremfor at synche hele metoden.
når du siger synchronized( objektInstans ) { // kode // 'objektInstans' er låst imens koden kører } så er det tilgang til KUN den objektinstans der lægges en lås på
når du gør en metode suncroniseret public synchronized void write(){ så er det den ojektinstans metoden kaldes i der bliver lagt en lås på objektInstans.write(); // 'objektInstans' er låst imens metoden kører
Der er ingen generel grund til at sige det ene er bedre end det andet.
Det eneste generellle er at man 1) bør undgå behovet for syncronisering hvis det er muligt 2) ikke låse flere data end strengt nødvendigt 3) passe på deadlocks.
Jeg tror jeg forstår. Ved et objekt der kan tilgås fra mange metoder, er det selvfølgeligt vigtigt at synkronisere entop det objekt når det tilgås. Her kunne man vel med rette bruge synchronized(object) etc.
med dit eksempel public void write(){ synchronized( instansAfStatiskString ){ // synchronized code } } her bruger du den string som en semafor for at undgå at andre kodestumper der benytter den samme semafor får lov at køre imens.
så med DET eksempel påtager du dig selv det fulde ansvar for at søger for at alle steder hvor de data der manipuleres bliver markeret med den samme syncronized sætning.
Det kan være en fordel nogen situationer, fx hvis der udskrives til en logfil fra mange tråde.
Men der følger ulemper med for de data der manipuleres i det låste område er reelt aldrig låst, enhver anden tråd kan tilgå og ændre dem, også imens din synkroniserede kode kører. Det eneste du sikrer dig er at flere kald til write ikke skriver tegn ud i munden på hinanden. "VariVarabiabel elx x harhar vær diværendien 25 25"
synchronized er altid coorperativ - uanset hvordan man gør det så er det programmørens ansvar at bruge synchronized på det samme som vil tilgå noget.
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.